Поиск в таблице базы данных с помощью FlexibleSearchService Hybris

#java #spring #hybris #flexible-search

#java #весна #sap-коммерция-облако #гибкий поиск

Вопрос:

Я пытаюсь создать DAO, который должен искать элемент в таблице базы данных. Я довольно новичок в Hybris, поэтому я не знаю, что именно здесь не так (запрос или мой нежелательный код). Это ошибка, которая появляется в cmd.

СЕРЬЕЗНОЕ: Servlet.service() для сервлета [DispatcherServlet] в контексте с path [] выдал исключение [Ошибка обработки запроса; вложенное исключение — de.hybris.platform.servicelayer.search.exceptions .Исключение FlexibleSearchException: ошибка поиска SQL — включите свойство ‘flexible.search.exception.show.запрос.подробности»для получения дополнительной информации] с основной причиной java.sql.SQLException: недопустимое значение для getLong()

Это моя реализация класса DAO

 @Component(value = "arbRedirectHttpTypeDao")
public class ArbRedirectHttpTypeDaoImpl implements ArbRedirectHttpTypeDao {

private static final Logger LOG = Logger.getLogger(ArbRedirectHttpTypeDaoImpl.class);

@Autowired
private FlexibleSearchService flexibleSearchService;

public FlexibleSearchService getFlexibleSearchService() {
    return flexibleSearchService;
}

public void setFlexibleSearchService(FlexibleSearchService flexibleSearchService) {
    this.flexibleSearchService = flexibleSearchService;
}

@Override
public ArbRedirectHttpTypeModel findNewUrlByOldUrl(String oldUrl) {

    final String query = "SELECT {"  ArbRedirectHttpTypeModel.NEWURL  "}"
              " FROM {"  ArbRedirectHttpTypeModel._TYPECODE  "} WHERE {"
              ArbRedirectHttpTypeModel.OLDURL  "}=?oldUrl";

    final FlexibleSearchQuery flexibleSearchQuery = new FlexibleSearchQuery(query);

    flexibleSearchQuery.addQueryParameter("oldUrl", oldUrl);

    final List<ArbRedirectHttpTypeModel> locationsByCode = flexibleSearchService
            .<ArbRedirectHttpTypeModel> search(flexibleSearchQuery)
            .getResult();

    LOG.info("-------------------------------------"   locationsByCode.get(0));
    if (locationsByCode != null amp;amp; !locationsByCode.isEmpty())
    {
        return locationsByCode.get(0);
    }
    else
    {
        return null;
    }

}
}
  

И здесь я пытаюсь его вызвать

  @Resource
 private ArbRedirectHttpTypeDao arbRedirectHttpTypeDao;
ArbRedirectHttpTypeModel arbRedirectHttpTypeModel = arbRedirectHttpTypeDao.findNewUrlByOldUrl("/Aapuvdc");
  

Ответ №1:

используйте «SELECT {» ArbRedirectHttpTypeModel.PK «}». Он вернет объект, и вы можете получить все атрибуты с помощью getter

Ответ №2:

 "SELECT {"  ArbRedirectHttpTypeModel.NEWURL  "}"
  

Здесь вы пытаетесь вернуть NEWURL модель, которая, я полагаю, будет строкой. Гибкий поисковый запрос возвращает pk из элемента и по умолчанию преобразует его в модель hybris. Вместо этого попробуйте реорганизовать свой запрос, чтобы выбрать pk

 "SELECT {"  ArbRedirectHttpTypeModel.PK  "}"
  

Или вы можете оставить запрос таким, какой он есть, и задать возвращаемый тип запроса, FlexibleSearchQuery.setResultClassList(classList); например:

 flexibleSearchQuery.setResultClassList(Collections.singletonList(String.class));
  

Вам не нужно приводить .search() ArbRedirectHttpTypeModel ни к одному из них. Вы можете просто использовать

 SearchResult<String> result = flexibleSearchService.search(flexibleSearchQuery).getResult();
return result.getCount() > 0 ? result.getResult().get(0) : null;
  

Комментарии:

1. Я помещаю некоторый код ниже, который вы воспроизводите, в результате я получаю только ПК, что я могу сделать, чтобы получить определенный элемент столбца?

2. не используйте setResultClassList и возвращайте результат как SearchResult< ArbRedirectHttpTypeModel>