如何在 Hibernate 中使用 row_number 函数编写查询?

Posted

技术标签:

【中文标题】如何在 Hibernate 中使用 row_number 函数编写查询?【英文标题】:How to write query in Hibernate with row_number function present in it? 【发布时间】:2014-06-17 10:24:26 【问题描述】:

我想将以下查询转换为 HQL

select X.* from (select tbl.*,ROW_NUMBER() over (partition by Col1 order by Col1) as RANK from table1 tbl where tbl.col2='22'
                    and (
                        tbl.col3 in (
                            'ABC'
                        )
                    ) 
              ) X
             WHERE X.rank = 1;

需要帮助。 这是在 Oracle 上将 mysql group by 转换为等效 group by 的上下文中。

编辑: 我原来的 MySQL 查询是

select * from table1 tbl 
where tbl.col2='22'
and tbl.col3 in ('ABC','XYZ')
group by col1;

我想先将其转换为 Oracle 等效查询,然后再转换为 HQL。

【问题讨论】:

【参考方案1】:

我认为您的查询与此查询非常接近:

select X.*
from table1 tbl
where tbl.col2 = '22' and tbl.col3 = 'ABC' and
      not exists (select 1
                  from table tbl2
                  where tbl2.col2 = tbl.col2 and tbl2.col3 = tbl.col3 and
                        tbl2.col1 < tbl.col1
                 );

唯一的区别是这两个查询如何处理col1 上的关系。这将返回所有这些值。您的将只返回其中一个。

也许这在 HQL 中对你有用。

【讨论】:

如果 Col1 不是数字数据类型怎么办? 以上内容应该适用于 Oracle 和 MySQL,并且很可能也适用于 HQL。 &lt; 运算符适用于大多数 SQL 数据类型。 我的目的是模拟分组依据,如果 col1 有重复值,您的查询可能会返回重复项 @user3705949 。 . .如果表中有唯一 ID,则可以解决此问题。您的原始查询依赖于 group by 的仅 MySQL 扩展,因此无论如何移植都会很困难。

以上是关于如何在 Hibernate 中使用 row_number 函数编写查询?的主要内容,如果未能解决你的问题,请参考以下文章

从 ROW_NUM 中仅选择编号最大的行以获取最新更新

我可以在不使用 ROW_NUM () OVER (ORDER BY xxxxx) 的情况下在 Sql Server 中对查询进行分页吗?

在 MYSQL 查询中显示行号

Excel教程(11) - 查找和引用函数

如何在 Hibernate 中使用加入 Java 程序?

在Hibernate中如何配置二级缓存。