使用FlexibleSearchService在数据库表中进行搜索。

huangapple go评论105阅读模式
英文:

Search in database table using FlexibleSearchService Hybris

问题

以下是要翻译的内容:

我尝试创建一个需要在数据库表中搜索项目的DAO。我在Hybris方面相当新,所以我不太清楚出了什么问题(查询还是我的代码有问题)。以下是在cmd中出现的错误信息:

SEVERE:在路径为 [] 的上下文中为servlet [DispatcherServlet] 提供服务时抛出异常 [请求处理失败;嵌套异常是 de.hybris.platform.servicelayer.search.exceptions.FlexibleSearchException:SQL搜索错误 - 启用属性 'flexible.search.exception.show.query.details' 以获取更多详细信息],根本原因如下
java.sql.SQLException:getLong() 的值无效

这是我的DAO类实现:

  1. @Component(value = "arbRedirectHttpTypeDao")
  2. public class ArbRedirectHttpTypeDaoImpl implements ArbRedirectHttpTypeDao {
  3. private static final Logger LOG = Logger.getLogger(ArbRedirectHttpTypeDaoImpl.class);
  4. @Autowired
  5. private FlexibleSearchService flexibleSearchService;
  6. public FlexibleSearchService getFlexibleSearchService() {
  7. return flexibleSearchService;
  8. }
  9. public void setFlexibleSearchService(FlexibleSearchService flexibleSearchService) {
  10. this.flexibleSearchService = flexibleSearchService;
  11. }
  12. @Override
  13. public ArbRedirectHttpTypeModel findNewUrlByOldUrl(String oldUrl) {
  14. final String query = "SELECT {" + ArbRedirectHttpTypeModel.NEWURL + "}"
  15. + " FROM {" + ArbRedirectHttpTypeModel._TYPECODE + "} WHERE {"
  16. + ArbRedirectHttpTypeModel.OLDURL + "}=?oldUrl";
  17. final FlexibleSearchQuery flexibleSearchQuery = new FlexibleSearchQuery(query);
  18. flexibleSearchQuery.addQueryParameter("oldUrl", oldUrl);
  19. final List<ArbRedirectHttpTypeModel> locationsByCode = flexibleSearchService
  20. .<ArbRedirectHttpTypeModel> search(flexibleSearchQuery)
  21. .getResult();
  22. LOG.info("-------------------------------------" + locationsByCode.get(0));
  23. if (locationsByCode != null && !locationsByCode.isEmpty()) {
  24. return locationsByCode.get(0);
  25. } else {
  26. return null;
  27. }
  28. }
  29. }

这里是我尝试调用它的部分:

  1. @Resource
  2. private ArbRedirectHttpTypeDao arbRedirectHttpTypeDao;
  3. ArbRedirectHttpTypeModel arbRedirectHttpTypeModel = arbRedirectHttpTypeDao.findNewUrlByOldUrl("/Aapuvdc");
英文:

I try to make a DAO what needs to search for an item in the database table. I'm pretty new in Hybris so I don't know what is wrong exactly here (query or my junk code). That is the error that appears in cmd.
> SEVERE: Servlet.service() for servlet [DispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is de.hybris.platform.servicelayer.search.exceptions.FlexibleSearchException: SQL search error - enable the property 'flexible.search.exception.show.query.details' for more details] with root cause
java.sql.SQLException: Invalid value for getLong()

That is my DAO class implementation

  1. @Component(value = &quot;arbRedirectHttpTypeDao&quot;)
  2. public class ArbRedirectHttpTypeDaoImpl implements ArbRedirectHttpTypeDao {
  3. private static final Logger LOG = Logger.getLogger(ArbRedirectHttpTypeDaoImpl.class);
  4. @Autowired
  5. private FlexibleSearchService flexibleSearchService;
  6. public FlexibleSearchService getFlexibleSearchService() {
  7. return flexibleSearchService;
  8. }
  9. public void setFlexibleSearchService(FlexibleSearchService flexibleSearchService) {
  10. this.flexibleSearchService = flexibleSearchService;
  11. }
  12. @Override
  13. public ArbRedirectHttpTypeModel findNewUrlByOldUrl(String oldUrl) {
  14. final String query = &quot;SELECT {&quot;+ ArbRedirectHttpTypeModel.NEWURL +&quot;}&quot;
  15. + &quot; FROM {&quot;+ ArbRedirectHttpTypeModel._TYPECODE +&quot;} WHERE {&quot;
  16. + ArbRedirectHttpTypeModel.OLDURL +&quot;}=?oldUrl&quot;;
  17. final FlexibleSearchQuery flexibleSearchQuery = new FlexibleSearchQuery(query);
  18. flexibleSearchQuery.addQueryParameter(&quot;oldUrl&quot;, oldUrl);
  19. final List&lt;ArbRedirectHttpTypeModel&gt; locationsByCode = flexibleSearchService
  20. .&lt;ArbRedirectHttpTypeModel&gt; search(flexibleSearchQuery)
  21. .getResult();
  22. LOG.info(&quot;-------------------------------------&quot; + locationsByCode.get(0));
  23. if (locationsByCode != null &amp;&amp; !locationsByCode.isEmpty())
  24. {
  25. return locationsByCode.get(0);
  26. }
  27. else
  28. {
  29. return null;
  30. }
  31. }
  32. }

And here I try to call it

  1. @Resource
  2. private ArbRedirectHttpTypeDao arbRedirectHttpTypeDao;
  3. ArbRedirectHttpTypeModel arbRedirectHttpTypeModel = arbRedirectHttpTypeDao.findNewUrlByOldUrl(&quot;/Aapuvdc&quot;);

答案1

得分: 1

  1. "SELECT {" + ArbRedirectHttpTypeModel.NEWURL + "}"
  2. 在这里您正在尝试返回模型的 `NEWURL`我假设它将是一个字符串默认情况下灵活搜索查询会返回项目的主键并将其默认转换为 hybris 模型您可以尝试重新组织查询以选择主键
  3. "SELECT {" + ArbRedirectHttpTypeModel.PK + "}"
  4. 或者您可以保持查询不变并使用 `FlexibleSearchQuery.setResultClassList(classList);` 设置查询的返回类型例如
  5. flexibleSearchQuery.setResultClassList(Collections.singletonList(String.class));
  6. 您也不需要将 `.search()` 强制转换为 `ArbRedirectHttpTypeModel`您可以使用以下方式
  7. SearchResult<String> result = flexibleSearchService.search(flexibleSearchQuery).getResult();
  8. return result.getCount() > 0 ? result.getResult().get(0) : null;
英文:
  1. &quot;SELECT {&quot;+ ArbRedirectHttpTypeModel.NEWURL +&quot;}&quot;

In here you're trying to return the NEWURL of the model, which I assume will be a string. Flexible search query returns the pk from the item and casts it to hybris model by default. Instead try to reorganize your query to select the pk

  1. &quot;SELECT {&quot;+ ArbRedirectHttpTypeModel.PK +&quot;}&quot;

Or you can leave the query as it is and set the return type of the query with FlexibleSearchQuery.setResultClassList(classList); such as:

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

You don't have to cast .search() to ArbRedirectHttpTypeModel either. You can just go with

  1. SearchResult&lt;String&gt; result = flexibleSearchService.search(flexibleSearchQuery).getResult();
  2. return result.getCount() &gt; 0 ? result.getResult().get(0) : null;

答案2

得分: 1

使用"SELECT {"+ ArbRedirectHttpTypeModel.PK +"}"。它将返回对象,您可以通过getter获取所有属性。

英文:

use "SELECT {"+ ArbRedirectHttpTypeModel.PK +"}". It will return object and you can get all attribute by getter

huangapple
  • 本文由 发表于 2020年10月15日 23:37:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/64375071.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定