Hibernate SELECT DISTINCT行为

时间:2014-10-13 06:39:51

标签: java hibernate hql distinct

我希望这个问题不重复,因为在另一个案例中我严重使用google(对我感到羞耻): - )

所以,我找不到我的问题的准确而明确的答案:在setFirstResult()和setMaxResults()之前应用hql中的“SELECT DISTINCT ...”吗?我希望保持冷静,我的应用程序中不会出现分页问题。

2 个答案:

答案 0 :(得分:2)

要回答实际问题,是的,在应用限制之前确定不同的结果集。 setFirstResult()setMaxResults()方法基本上等同于查询中的LIMIT子句。

如果您同时使用两者,则要求在上面两个方法调用的索引之间限制不同的结果集。

一个例子:

您的结果集包含100条记录。列X中有20条不同的记录。您设置了以下条件:

Criteria critiera = getCurrentSession().createCritiera(Foo.class);
criteria.add(Projections.distinct(Projections.property("X")));
criteria.setFirstResult(0);
criteria.setMaxResults(10);
List<Foo> fooList = critiera.list();

fooList将包含10个结果,从20个结果的不同结果集开始。

如果您将上述内容更改为

criteria.setFirstResult(4);
criteria.setMaxResults(20);

fooList将包含15个结果,省略前5个结果。

结果集的排序方式可能不明确,因此每次都可能得不到相同的10个结果。

答案 1 :(得分:0)

SELECT DISTINCT

在SELECT之后使用关键字DISTINCT时,它可以作为简单GROUP BY子句的快捷方式替换。 SELECT列表中的表达式直接用作。以下SELECT DISTINCT和SELECT与GROUP BY的示例是等效的。来自reference documentation

SELECT DISTINCT d, e + f FROM atable WHERE a + b = c
 SELECT d, e + f FROM atable WHERE a + b = c GROUP BY d, e + f`