当前位置:  开发笔记 > 编程语言 > 正文

如何通过连接和基于行的限制(分页)在hibernate中获得明显的结果?

如何解决《如何通过连接和基于行的限制(分页)在hibernate中获得明显的结果?》经验,为你挑选了4个好方法。

我正在尝试使用基于行的限制(例如:setFirstResult(5)setMaxResults(10))在已连接到其他表的Hibernate Criteria查询上实现分页.

可以理解的是,数据随机被切断; 这里解释了原因.

作为解决方案,页面建议使用"第二个sql选择"而不是连接.

如何将现有条件查询(使用连接createAlias())转换为使用嵌套选择?



1> 小智..:

您可以通过请求不同的ID列表而不是不同的水合对象列表来实现所需的结果.

只需将其添加到您的标准:

criteria.setProjection(Projections.distinct(Projections.property("id")));

现在,您将根据基于行的限制获得正确数量的结果.这样做的原因是因为投影将执行清晰度检查作为 sql查询的一部分,而不是ResultTransformer 执行sql查询过滤清除结果的结果.

值得注意的是,您现在将获得一个id列表,而不是获取对象列表,您可以使用这些ID来稍后从休眠中对对象进行水合.


这不适用于连接上的orderby
FishBoy其实就是我.回到'08,你不能回答自己的问题.
你以后如何保湿这些物品?

2> 小智..:

我正在使用我的代码.

只需将其添加到您的标准:

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

该代码将类似于本机sql的select distinct*from table.希望这个有所帮助.


在这种情况下这不起作用 - 请参阅FishBoy的答案解释原因.
downvoted,因为这个答案是完全错误的,无论是在这个问题的背景下还是关于它的内容,如这里所解释的[http://stackoverflow.com/questions/25536868/criteria-distinct-root-entity-vs-projections-distinct ]**执行查询后,通过ResultSetTransformer完成此"distinct"**
另外,根据Daniel Alexiuc在他的问题中提供的链接,这并不总是转换为本机sql中的distinct子句.但如果您不需要分页,它确实有效.
简单错误的答案,不符合结果限制,投票的人不需要限制

3> Daniel Alexi..:

根据FishBoy的建议略有改进.

可以在一次点击中进行这种查询,而不是在两个单独的阶段中进行.即,下面的单个查询将正确地分页不同的结果,并且还返回实体而不仅仅是ID.

只需使用带有id投影的DetachedCriteria作为子查询,然后在主Criteria对象上添加分页值.

它看起来像这样:

DetachedCriteria idsOnlyCriteria = DetachedCriteria.forClass(MyClass.class);
//add other joins and query params here
idsOnlyCriteria.setProjection(Projections.distinct(Projections.id()));

Criteria criteria = getSession().createCriteria(myClass);
criteria.add(Subqueries.propertyIn("id", idsOnlyCriteria));
criteria.setFirstResult(0).setMaxResults(50);
return criteria.list();


试过这个.不行.子查询可以工作,但主查询仍然不受"distinct"约束.

4> nikita..:

@ FishBoy建议的一个小改进是使用id投影,因此您不必对标识符属性名称进行硬编码.

criteria.setProjection(Projections.distinct(Projections.id()));

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有