【问题标题】:Spring jpa native query sorting adding prefix to order by field nameSpring jpa本机查询排序添加前缀以按字段名称排序
【发布时间】:2018-11-01 16:41:18
【问题描述】:

我的排序有问题。

存储库方法:

@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);

【问题讨论】:

    标签: java sorting spring-data-jpa nativequery


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      "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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 我也需要分页,所以需要一个Pageable对象。我已经通过将查询从本机查询更改为 jpa 查询来解决这个问题,并且它正在工作。错误在本机查询处理中的某个地方
        猜你喜欢
        • 2015-05-05
        • 1970-01-01
        • 1970-01-01
        • 2012-03-14
        • 1970-01-01
        • 1970-01-01
        • 2016-09-28
        • 2019-01-13
        • 2018-07-22
        相关资源
        最近更新 更多