java 通过从Repository方法返回Page< >生成的计数查询在org.hibernate上崩溃,QueryException:意外字符:'`'

dauxcl2d  于 2023-09-29  发布在  Java
关注(0)|答案(1)|浏览(150)

冒着巨大的风险,我试图合并使用一个本地查询,@SqlResultSetMapper +非实体POJO(MyDto),以及一个存储库方法,它将Pageable作为参数并返回Page。在克服了一些障碍之后,它几乎起作用了:

  • 我的实体类名为Order,数据库表也是如此
  • 我将查询结果Map到的DTO类是MyDto
  • 我的存储库被定义为public interface MyRepository extends JpaRepository<Order, Long>

在我的存储库中,如果我用途:List<MyDto> findResults(Pageable page)我得到1页结果列表;一切正常。
但是,如果我用途:Page<MyDto> findResults(Pageable page),发生了以下情况:

  1. Error occurred while processing the request: org.springframework.dao.InvalidDataAccessApiUsageException:
  2. org.hibernate.QueryException: unexpected char: '`' [select count(o) from `order` o ...

(the查询在“...”之后继续,并且其中的任何其他地方都没有反引号)

返回Page会导致Hibernate生成一个无法解析的查询(但应该可以)

我认为不值得提供@NamedNativeQuery的东西,因为它可以工作,并且不会影响返回Page如何导致这个计数查询的生成。我倾向于认为这是一个Hibernate的bug,但我希望有一个解决方案。
我该怎么办?反引号是 * 必需的 ,因为order是MySQL关键字,即使它们不是,我也不明白为什么它不能解析它(特别是*,因为它生成了它**)。

dgiusagp

dgiusagp1#

其实我想明白了通过从repository方法返回Page生成的count查询可以通过以下转换提供您自己的查询来避免:
转换这个:

  1. @Entity
  2. @Table(name=`order`)
  3. @SqlResultSetMapping(
  4. name="myDtoMapping",
  5. classes={
  6. @ConstructorResult(
  7. targetClass=MyDto.class,
  8. columns={
  9. @ColumnResult(name="id", type=Long.class),
  10. //Other columns...
  11. }
  12. )
  13. }
  14. )
  15. @NamedNativeQuery(name="Order.findResults", query=myVariablePointingToQuery, resultSetMapping="myDtoMapping")
  16. public class Order{
  17. ...

对此:

  1. @Entity
  2. @Table(name=`order`)
  3. @SqlResultSetMappings({
  4. @SqlResultSetMapping(
  5. name="myDtoMapping",
  6. classes={
  7. @ConstructorResult(
  8. targetClass=MyDto.class,
  9. columns={
  10. @ColumnResult(name="id", type=Long.class),
  11. //Other columns...
  12. }
  13. )
  14. }
  15. ),
  16. @SqlResultSetMapping(name="myDtoMapping.count", columns=@ColumnResult(name="cnt"))}
  17. )
  18. @NamedNativeQueries({
  19. @NamedNativeQuery(name="Order.findResults", query=myVariablePointingToQuery, resultSetMapping="myDtoMapping"),
  20. @NamedNativeQuery(name = "Order.findResults.count", query=myVariablePointingToCOUNTINGQuery, resultSetMapping = "myDtoMapping.count")
  21. })

注意,现在有一个SqlResultSetMapping@NamedNativeQuery用于count,还有一个自定义count查询,顺便说一下,它被定义为**

  1. "select count(*) as cnt \n" //newline is important!

**因为即使有一个尾随空格,查询结果也是“select count(*)as cntfrom”。一只虫子

但现在一切正常!

展开查看全部

相关问题