Spring jpa native query sorting添加前缀按字段名排序

tez616oj  于 8个月前  发布在  Spring
关注(0)|答案(5)|浏览(79)

我对排序有问题。
存储库方法:

@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前缀是从哪里来的,在Hibernateorder by部分(接近结尾)。
作为参考,我使用:
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);
i5desfxk

i5desfxk1#

这里是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+)

负责不正确的别名提取。我的解决方案是重写本机查询,因此它与提供的regexp不匹配。

z0qdvdin

z0qdvdin2#

现在回答这个问题可能有点晚了。但我想分享一下我是如何解决这个问题的。对于本机查询,在应用排序条件时,似乎Hibernate试图使用查询中使用的第一个表的别名。在您的例子中,第一个表别名是R,因此您在hibernate生成的查询中看到R.name desc
解决此问题的一种方法是将查询 Package 在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"

这样,在运行时,Hibernate会在查询的顶部应用排序条件,现在对应于R

tag5nh1u

tag5nh1u3#

它有排序类,你可以使用这个。除此之外,它很容易使用。
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.sorting

qcuzuvrc

qcuzuvrc4#

我遇到了类似的问题,特别是在复杂查询的情况下,查询中有ORDER BY。我得到语法错误,因为,被添加到ORDER BY之前。
我解决这个问题的方法是创建一个VIEW,其中SELECT查询具有结果集和WHERE条件所需的必要字段(因此您可以在WHERE条件下对VIEW运行带有参数的查询)。并将本机查询写入SELECTFROMVIEW

CREATE VIEW my_view AS (// your complex select query with required fields);

@Query("SELECT field1 AS alias1, field2  AS alias2 FROM my_view  "
        + "WHERE field3  = :param1 AND field4 = :param2")
Page<MyDto> myFunction(@Param("param1") Long param1, @Param("param1") String param2, Pageable pageable);
enyaitl3

enyaitl35#

对于任何搜索简单解决方案的人,您可以使用JPASort.by(),它不会向结果查询添加别名

相关问题