我希望这个问题不重复,因为在另一个案例中我严重使用google(对我感到羞耻): - )
所以,我找不到我的问题的准确而明确的答案:在setFirstResult()和setMaxResults()之前应用hql中的“SELECT DISTINCT ...”吗?我希望保持冷静,我的应用程序中不会出现分页问题。
答案 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`