2015-11-05 1 views
2

я должен сделать это гибкий поисковый запрос в классе сервис Java:Гибкий поиск с параметрами возврата нулевое значение

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 службы я писал:

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(")"); 
     } 

    } 

} 

Строка запроса перед поиском (запрос) .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)}] 

но после поиска (запрос)результата является [пустой]. Почему? Где я ошибаюсь в коде Java? Благодарю.

ответ

5

Кроме того, если вы хотите отключить ограничение в своем 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 ОГРАНИЧЕНИЙ = True, который будет выполнять запрос в контексте администратора [без ограничений].

Проверить this

Лучше я хотел бы предложить вам, чтобы проверить, что ограничение в точности применения к вашему типу элемента. Вы можете просто проверить в Backoffice/HMC

Backoffice:

  1. Перейти к системы-> Персонализация (SearchRestricion)
  2. Поиск по Запретной Тип
  3. Проверка фильтра запросов и анализа ваших данных пункт на его основе ,
  4. Вы также можете проверить его Принципала (UserGroup), на которое было применено ограничение.
  5. Чтобы подтвердить, просто проверьте, отключив активный флаг.
+0

Отличный !!!!! Спасибо!!! – sharkbait

+0

Смотрите, теперь вы сказали ему очень плохо. В результате у него будет больше ошибок. Вы не хотите отключать ограничения - вы хотите иметь правильные ограничения, используя нужного пользователя. –

0

Как утверждение выглядит нормально для меня, я собираюсь пойти с видимостью данных. Можете ли вы просмотреть все элементы как любой пользователь, которому вы выполняете запрос? В hac вы, очевидно, будете администратором.

+0

Да, пользователь, которого я использую для проведения теста, является администратором, как в консоли ... – sharkbait

+0

no Это было анонимно –

2

Запрос в коде работает не под пользователем администратора (скорее всего). И в этом случае к запросу применяются различные ограничения поиска.

Вы можете увидеть, что первоначальный запрос изменен:

  • старт DB каротаж (/ HAC -> Мониторинг -> База данных -> каротаж JDBC);
  • выполнить запрос из кода;
  • Остановить регистрацию в журнале и проверить файл журнала.

Дополнительная информация: https://wiki.hybris.com/display/release5/Restrictions

В/ССА консоли администратора пользователь, как правило, используются и ограничения не будут применяться из-за этого.