Ответ FlexibleSearchQuery нет данных

Я пытаюсь получить данные с помощью FlexibleSearchQuery, но он возвращает пустой результат. Если я задаю этот запрос hac>Console>Flexible Search, я смогу получить данные, которые ищу. Вот как я пишу запрос в java файле.

sb.append(" SELECT {p:pk} ");
        sb.append(" FROM {" + ProductModel._TYPECODE + " AS p} ");
        sb.append(" WHERE {p:" + ProductModel.PK + " } IN ({{");
        sb.append(" SELECT DISTINCT {pro:" + ProductModel.PK + "} ");
        sb.append(" FROM {CategoryProductRelation AS cp},{" + ProductModel._TYPECODE + "! AS pro},{" + CategoryModel._TYPECODE
                + " AS c}");
        sb.append(" WHERE {pro:" + ProductModel.PK + " } = {cp:target}");
        sb.append("  AND {c:" + CategoryModel.PK + " } = {cp:source}");
        sb.append("  AND {c:" + CategoryModel.CODE + " } !=?categoryCode    }})");



args.put("categoryCode", categoryCode);

if (args != null && !args.isEmpty())
{
            searchQuery.addQueryParameters(args);
}

Вот как я называю поиск

final FlexibleSearchQuery searchQuery = new FlexibleSearchQuery(sb.toString());

searchResult.getResult().size()  >> retuns 0

Если я наберу его в консоли

SELECT {p:pk} FROM { Product AS p} WHERE { p: pk } IN ({{ 

            SELECT DISTINCT {pro: PK } 

                  FROM 

            {CategoryProductRelation AS cp}, 
            {Product AS pro}, 
            {Category as c} 

            WHERE {pro: PK} = {cp:target}

            AND {c:PK} = {cp:source}
            AND {c:code} != '0101'}})

я получил

PK
8796093579265
8796101804033
8796100165633
8796098428929
8796093153281
8796102361089
8796097052673
8796093808641
8796093972481
8796096823297

Что я делаю неправильно? Есть ли разница в консольном запросе и строковом запросе?


person mamur    schedule 18.05.2017    source источник


Ответы (2)


Я думаю, что проблема в вашем случае связана с ограничениями по определению: ограничения - это правила, которым подчиняется FlexibleSearch, которые позволяют ограничивать результаты поиска в зависимости от того, какой тип ищется и какой пользователь в настоящее время вошел в систему

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

import de.hybris.platform.search.restriction.SearchRestrictionService;
...
// Disable search restrictions
searchRestrictionService.disableSearchRestrictions();
// some query goes here

// Enable search restrictions
searchRestrictionService.enableSearchRestrictions();
// some query goes here

С другой стороны, когда вы используете hac>Console>Flexible Search, я полагаю, что вы входите в систему как администратор, поэтому все ограничения по умолчанию отключены в Hybris Flexible search.

Вы можете проверить все ограничения активности в HMC, выполнив поиск по типу: SearchRestriction, посмотрите следующий снимок экрана.

введите здесь описание изображения

см. https://help.hybris.com/6.3.0/hcd/8c428f8286691014970ceee87aa01605.html

person Monsif EL AISSOUSSI    schedule 18.05.2017
comment
Ответ от Гийома А. лучше, потому что отключение ограничений в службе влияет на весь текущий выполняемый код и может вызвать проблемы с безопасностью. - person reichhart; 30.04.2021

Другой способ обойти ограничение - использовать sessionService для выполнения

sessionService.executeInLocalView(new SessionExecutionBody() { @Override public void executeWithoutResult() { // do stuff } }, userService.getAdminUser());

Я считаю это решение более элегантным. :-)

person Guillaume A.    schedule 22.05.2017
comment
С точки зрения безопасности это лучший ответ, потому что у него нет проблем с параллельным запуском кода, как если бы вы отключили ограничения в сервисе. - person reichhart; 30.04.2021