Spring jpa本机查询排序按字段名

时间:2018-05-22 20:06:37

标签: java sorting spring-data-jpa nativequery

我有排序问题。

存储库方法:

@Query(nativeQuery = true,
    value = "SELECT D.ID as dealerId , D.NAME as dealerName, K.ID as kpiId, " +
    "K.NAME as kpiName FROM REGION R, DEALER D, KPI K "
    + "WHERE R.IMPORTER_ID = :importerId "
    + "AND D.REGION_ID = R.ID "
    + "AND K.IMPORTER_ID = :importerId ")

Page<DealersKpiTargets> getDealersKpiTargets(@Param("importerId") Long importerId, Pageable pageable);

可分页对象:

Page request [number: 0, size 20, sort: name: DESC]

休眠日志:

Hibernate: SELECT D.ID as dealerId , D.NAME as dealerName, K.ID as kpiId, K.NAME as kpiName FROM REGION R, DEALER D, KPI K WHERE R.IMPORTER_ID = ? AND D.REGION_ID = R.ID AND K.IMPORTER_ID = ?  order by R.name desc limit ?

我不明白R.name前缀来自order by部分Hibernate(到最后)。

供参考,我正在使用:

  

spring-data-jpa版本2.0.7.RELEASE

     

spring-boot-starter-data-jpa版本2.0.2.RELEASE

更新

我已经通过将查询从原生查询更改为jpa查询并解决了这个问题而解决了这个问题。我改变了笛卡尔加入版本。

        @Query("SELECT dealerEntity.id AS dealerId , dealerEntity.name AS dealerName, kpiEntity.id AS kpiId, " +
        "kpiEntity.name AS kpiName FROM KpiEntity kpiEntity "
        + "JOIN RegionEntity regionEntity ON regionEntity.importerEntity = kpiEntity.importerEntity "
        + "JOIN DealerEntity dealerEntity ON dealerEntity.importerEntity = regionEntity.importerEntity "
        + "WHERE kpiEntity.importerEntity = :importerEntity ")
Page<DealersKpiTargets> getDealersKpiTargets(@Param("importerEntity") ImporterEntity importerEntity, Pageable pageable);

3 个答案:

答案 0 :(得分:1)

回答这个问题可能有点晚了。但是想分享一下我如何解决这个问题。 对于本机查询,休眠似乎在应用排序条件时尝试使用查询中使用的第一个表的别名。在您的情况下,第一个表别名为R,因此您在由hibernate生成的查询中看到R.name desc

解决此问题的一种方法是将查询包装在select子句中,并将其命名为R,例如

"SELECT * FROM(SELECT D.ID as dealerId , D.NAME as dealerName, K.ID as kpiId, " +
    "K.NAME as kpiName FROM REGION R, DEALER D, KPI K "
    + "WHERE R.IMPORTER_ID = :importerId "
    + "AND D.REGION_ID = R.ID "
    + "AND K.IMPORTER_ID = :importerId ) R"

通过这种方式,运行时休眠将在查询顶部应用排序条件,该条件现在对应于R

答案 1 :(得分:0)

它有排序类,你可以使用它。此外,它易于使用。

https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.sorting

答案 2 :(得分:0)

这是jira票证,其中包含更多详细信息,可以作为解决问题的关键(https://jira.spring.io/browse/DATAJPA-1613)。

QueryUtils.ALIAS_MATCH

(?<=from)(?:\s)+([._[\P\\{Z}&&\P\\{Cc}&&\P\\{Cf}&&\P\\{P}]]+)(?:\sas)*(?:\s)+(?!(?:where|group\s*by|order\s*by))(\w+)

负责错误的别名提取。我的案例的解决方案是重写本机查询,因此它与提供的正则表达式不匹配。