当前位置: 首页 > 知识库问答 >
问题:

Spring jpa原生查询排序按字段名添加前缀

纪俊良
2023-03-14
@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日志:

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前缀来自哪里,在hibernate中的order by部分(接近末尾)。

作为参考,我使用:

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

共有1个答案

赵禄
2023-03-14

这样回答这个问题可能有点晚了。但我想分享我是如何绕过这个问题的。对于本机查询,hibernate在应用排序条件时似乎尝试使用查询中使用的第一个表的别名。在您的示例中,第一个表别名是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"

这样,在运行时,hibernate将在查询的顶部应用排序条件,该条件现在对应于r

 类似资料:
  • 我有一篇有三个元域的帖子。 我想查询这个类别,并根据其中一个的元字段值对帖子进行排序。我现在使用的参数是: 其中times是元字段的名称。上面的代码没有返回任何内容。

  • 问题内容: 谁能指出我如何将order by子句作为命名参数传递给HQL? 有效的示例: 无效的示例: 问题答案: 不支持,只能在and 子句中使用输入参数,并且不能为子句使用参数。或者,如果我改写,您不能对列使用参数,只能对值使用。因此,要么: 有尽可能多的命名查询排序顺序 将排序字符串连接到查询字符串 使用条件查询

  • 问题内容: 我创建了一个存储过程,我想在其中添加替代的order by子句。问题是查询在“无效的列名’aantal regels’”上失败 这是我现在的查询。 希望有人可以帮助我! 问题答案: 您不能以这种方式按别名排序。 第一种选择是重复代码。注意:仅仅因为重复代码,SQL引擎就不会天真地再次执行它,而是重用了结果。 或全部使用子查询…

  • 本文向大家介绍MySQL中给自定义的字段查询结果添加排名的方法,包括了MySQL中给自定义的字段查询结果添加排名的方法的使用技巧和注意事项,需要的朋友参考一下  我正在用 MySQL 客户端的时候,突然想到如果可以给查询结果添加排名该多好啊,然后就找到了一个简单的解决办法。 下面是一个示例表的数据:  然后我们要根据 Roll_No 字段进行排序并给出排名,我们首先必须定义一个初始值为0的变量,然

  • 问题内容: 我有一个用户模型和一个提交模型。每个提交都有一个上载用户的外键字段user_submitted。 我的问题很简单:如何获得提交量最多的三个用户的列表? 我尝试在用户模型上创建num_submissions方法: 然后执行: 但这失败了,就像我尝试过的所有其他尝试一样。我实际上可以使用智能数据库查询吗?还是我应该在视图文件中做些更怪异的事情? 问题答案: 你没有在示例模型代码中提及,但在

  • Db类支持原生SQL查询操作,主要包括下面两个方法: query方法 query方法用于执行SQL查询操作,如果数据非法或者查询错误则返回false,否则返回查询结果数据集(同select方法)。 使用示例: Db::query("select * from think_user where status=1"); 如果你当前采用了分布式数据库,并且设置了读写分离的话,query方法始终是在读服务