灵活搜索参数 return 空值
Flexible search with parameters return null value
我必须在服务中执行此灵活的搜索查询 Java class:
select sum({oe:totalPrice})
from {Order as or join CustomerOrderStatus as os on {or:CustomerOrderStatus}={os:pk}
join OrderEntry as oe on {or.pk}={oe.order}}
where {or:versionID} is null and {or:orderType} in (8796093066999)
and {or:company} in (8796093710341)
and {or:pointOfSale} in (8796097413125)
and {oe:ecCode} in ('13','14')
and {or:yearSeason} in (8796093066981)
and {os:code} not in ('CANCELED', 'NOT_APPROVED')
当我在 hybris 管理控制台中执行此查询时,我正确地获得了:
1164.00000000
在我的 Java 服务 class 中,我这样写:
private BigDecimal findGroupedOrdersData(String total, String uncDisc, String orderPromo,
Map<String, Object> queryParameters) {
BigDecimal aggregatedValue = new BigDecimal(0);
final StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("select sum({oe:").append(total).append("})");
queryBuilder.append(
" from {Order as or join CustomerOrderStatus as os on {or:CustomerOrderStatus}={os:pk} join OrderEntry as oe on {or.pk}={oe.order}}");
queryBuilder.append(" where {or:versionID} is null");
if (queryParameters != null && !queryParameters.isEmpty()) {
appendWhereClausesToBuilder(queryBuilder, queryParameters);
}
queryBuilder.append(" and {os:code} not in ('");
queryBuilder.append(CustomerOrderStatus.CANCELED.getCode()).append("', ");
queryBuilder.append("'").append(CustomerOrderStatus.NOT_APPROVED.getCode()).append("')");
FlexibleSearchQuery query = new FlexibleSearchQuery(queryBuilder.toString(), queryParameters);
List<BigDecimal> result = Lists.newArrayList();
query.setResultClassList(Arrays.asList(BigDecimal.class));
result = getFlexibleSearchService().<BigDecimal> search(query).getResult();
if (!result.isEmpty() && result.get(0) != null) {
aggregatedValue = result.get(0);
}
return aggregatedValue;
}
private void appendWhereClausesToBuilder(StringBuilder builder, Map<String, Object> params) {
if ((params == null) || (params.isEmpty()))
return;
for (String paramName : params.keySet()) {
builder.append(" and ");
if (paramName.equalsIgnoreCase("exitCollection")) {
builder.append("{oe:ecCode}").append(" in (?").append(paramName).append(")");
} else {
builder.append("{or:").append(paramName).append("}").append(" in (?").append(paramName).append(")");
}
}
}
search(query).getResult()函数前的查询字符串为:
query: [select sum({oe:totalPrice}) from {Order as or join CustomerOrderStatus as os on {or:CustomerOrderStatus}={os:pk}
join OrderEntry as oe on {or.pk}={oe.order}} where {or:versionID} is null
and {or:orderType} in (?orderType) and {or:company} in (?company)
and {or:pointOfSale} in (?pointOfSale) and {oe:ecCode} in (?exitCollection)
and {or:yearSeason} in (?yearSeason) and {os:code} not in ('CANCELED', 'NOT_APPROVED')],
query parameters: [{orderType=OrderTypeModel (8796093230839),
pointOfSale=B2BUnitModel (8796097413125), company=CompanyModel (8796093710341),
exitCollection=[13, 14], yearSeason=YearSeasonModel (8796093066981)}]
但在 search(query) result 之后是 [null]。
为什么? Java 代码哪里错了?谢谢。
由于该声明在我看来还不错,所以我将继续关注数据的可见性。您是否能够以 运行 作为查询的任何用户的身份查看所有项目?在 hac 中,您显然是管理员。
代码中的查询 运行ning 不在管理员用户下(很可能)。
在这种情况下,不同的搜索限制将应用于查询。
可以看到原来的查询改了:
- 启动数据库日志记录(/hac -> 监控 -> 数据库 -> JDBC 日志记录);
- 运行来自代码的查询;
- 停止数据库记录并检查日志文件。
更多信息:https://wiki.hybris.com/display/release5/Restrictions
在 /hac 控制台中,通常使用 admin 用户,因此不会应用限制。
此外,如果您想在 java 代码中禁用限制。你可以这样做..
@Autowired
private SearchRestrictionService searchRestrictionService;
private BigDecimal findGroupedOrdersData(String total, String uncDisc, String orderPromo,
Map<String, Object> queryParameters) {
searchRestrictionService.disableSearchRestrictions();
// You code here
searchRestrictionService.enableSearchRestrictions();
return aggregatedValue;
}
在上面的代码中,您可以禁用搜索限制,在搜索结果出现后,您可以再次启用它。
或
您可以使用 sessionService 在本地视图中执行灵活的搜索查询。 executeInLocalView 方法可用于在隔离会话中执行代码。
(SearchResult<? extends ItemModel>) sessionService.executeInLocalView(new SessionExecutionBody()
{
@Override
public Object execute()
{
sessionService.setAttribute(FlexibleSearch.DISABLE_RESTRICTIONS, Boolean.TRUE);
return flexibleSearchService.search(query);
}
});
此处您设置 DISABLE RESTRICTIONS = true,这将 运行 管理上下文中的查询 [Without Restriction]。
勾选this
更好的是,我建议您检查具体适用于您的项目类型的限制。您只需签入 Backoffice/HMC
后台:
- 转到系统-> 个性化(搜索限制)
- 按受限类型搜索
- 检查过滤器查询并根据它分析您的项目数据。
- 您还可以查看应用了限制的主体(用户组)。
- 要确认,只需通过禁用活动标志进行检查。
我必须在服务中执行此灵活的搜索查询 Java class:
select sum({oe:totalPrice})
from {Order as or join CustomerOrderStatus as os on {or:CustomerOrderStatus}={os:pk}
join OrderEntry as oe on {or.pk}={oe.order}}
where {or:versionID} is null and {or:orderType} in (8796093066999)
and {or:company} in (8796093710341)
and {or:pointOfSale} in (8796097413125)
and {oe:ecCode} in ('13','14')
and {or:yearSeason} in (8796093066981)
and {os:code} not in ('CANCELED', 'NOT_APPROVED')
当我在 hybris 管理控制台中执行此查询时,我正确地获得了:
1164.00000000
在我的 Java 服务 class 中,我这样写:
private BigDecimal findGroupedOrdersData(String total, String uncDisc, String orderPromo,
Map<String, Object> queryParameters) {
BigDecimal aggregatedValue = new BigDecimal(0);
final StringBuilder queryBuilder = new StringBuilder();
queryBuilder.append("select sum({oe:").append(total).append("})");
queryBuilder.append(
" from {Order as or join CustomerOrderStatus as os on {or:CustomerOrderStatus}={os:pk} join OrderEntry as oe on {or.pk}={oe.order}}");
queryBuilder.append(" where {or:versionID} is null");
if (queryParameters != null && !queryParameters.isEmpty()) {
appendWhereClausesToBuilder(queryBuilder, queryParameters);
}
queryBuilder.append(" and {os:code} not in ('");
queryBuilder.append(CustomerOrderStatus.CANCELED.getCode()).append("', ");
queryBuilder.append("'").append(CustomerOrderStatus.NOT_APPROVED.getCode()).append("')");
FlexibleSearchQuery query = new FlexibleSearchQuery(queryBuilder.toString(), queryParameters);
List<BigDecimal> result = Lists.newArrayList();
query.setResultClassList(Arrays.asList(BigDecimal.class));
result = getFlexibleSearchService().<BigDecimal> search(query).getResult();
if (!result.isEmpty() && result.get(0) != null) {
aggregatedValue = result.get(0);
}
return aggregatedValue;
}
private void appendWhereClausesToBuilder(StringBuilder builder, Map<String, Object> params) {
if ((params == null) || (params.isEmpty()))
return;
for (String paramName : params.keySet()) {
builder.append(" and ");
if (paramName.equalsIgnoreCase("exitCollection")) {
builder.append("{oe:ecCode}").append(" in (?").append(paramName).append(")");
} else {
builder.append("{or:").append(paramName).append("}").append(" in (?").append(paramName).append(")");
}
}
}
search(query).getResult()函数前的查询字符串为:
query: [select sum({oe:totalPrice}) from {Order as or join CustomerOrderStatus as os on {or:CustomerOrderStatus}={os:pk}
join OrderEntry as oe on {or.pk}={oe.order}} where {or:versionID} is null
and {or:orderType} in (?orderType) and {or:company} in (?company)
and {or:pointOfSale} in (?pointOfSale) and {oe:ecCode} in (?exitCollection)
and {or:yearSeason} in (?yearSeason) and {os:code} not in ('CANCELED', 'NOT_APPROVED')],
query parameters: [{orderType=OrderTypeModel (8796093230839),
pointOfSale=B2BUnitModel (8796097413125), company=CompanyModel (8796093710341),
exitCollection=[13, 14], yearSeason=YearSeasonModel (8796093066981)}]
但在 search(query) result 之后是 [null]。 为什么? Java 代码哪里错了?谢谢。
由于该声明在我看来还不错,所以我将继续关注数据的可见性。您是否能够以 运行 作为查询的任何用户的身份查看所有项目?在 hac 中,您显然是管理员。
代码中的查询 运行ning 不在管理员用户下(很可能)。 在这种情况下,不同的搜索限制将应用于查询。
可以看到原来的查询改了:
- 启动数据库日志记录(/hac -> 监控 -> 数据库 -> JDBC 日志记录);
- 运行来自代码的查询;
- 停止数据库记录并检查日志文件。
更多信息:https://wiki.hybris.com/display/release5/Restrictions
在 /hac 控制台中,通常使用 admin 用户,因此不会应用限制。
此外,如果您想在 java 代码中禁用限制。你可以这样做..
@Autowired
private SearchRestrictionService searchRestrictionService;
private BigDecimal findGroupedOrdersData(String total, String uncDisc, String orderPromo,
Map<String, Object> queryParameters) {
searchRestrictionService.disableSearchRestrictions();
// You code here
searchRestrictionService.enableSearchRestrictions();
return aggregatedValue;
}
在上面的代码中,您可以禁用搜索限制,在搜索结果出现后,您可以再次启用它。
或
您可以使用 sessionService 在本地视图中执行灵活的搜索查询。 executeInLocalView 方法可用于在隔离会话中执行代码。
(SearchResult<? extends ItemModel>) sessionService.executeInLocalView(new SessionExecutionBody()
{
@Override
public Object execute()
{
sessionService.setAttribute(FlexibleSearch.DISABLE_RESTRICTIONS, Boolean.TRUE);
return flexibleSearchService.search(query);
}
});
此处您设置 DISABLE RESTRICTIONS = true,这将 运行 管理上下文中的查询 [Without Restriction]。
勾选this
更好的是,我建议您检查具体适用于您的项目类型的限制。您只需签入 Backoffice/HMC
后台:
- 转到系统-> 个性化(搜索限制)
- 按受限类型搜索
- 检查过滤器查询并根据它分析您的项目数据。
- 您还可以查看应用了限制的主体(用户组)。
- 要确认,只需通过禁用活动标志进行检查。