gpt4 book ai didi

java - Hibernate - 分页的不同结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:10:48 25 4
gpt4 key购买 nike

这似乎是多年来众所周知的问题,可以在这里阅读: http://blog.xebia.com/2008/12/11/sorting-and-pagination-with-hibernate-criteria-how-it-can-go-wrong-with-joins/

甚至可以在 hibernate 常见问题解答中找到引用资料:

https://community.jboss.org/wiki/HibernateFAQ-AdvancedProblems#Hibernate_does_not_return_distinct_results_for_a_query_with_outer_join_fetching_enabled_for_a_collection_even_if_I_use_the_distinct_keyword

之前在 SO 上也讨论过这个

How to get distinct results in hibernate with joins and row-based limiting (paging)?

问题是,即使通过所有这些资源,我也无法解决我的问题,这似乎与这个标准问题有点不同,尽管我不确定。

此处提出的标准解决方案涉及创建两个查询,第一个查询用于获取不同的 ID,然后在更高级别的查询中使用这些查询来获取所需的分页。在我的例子中,hibernate 类类似于

A
- aId
- Set<B>

B
- bId

在我看来,子查询似乎对我来说工作正常并且能够获得不同的 aId,但是应该进行分页的外部查询再次获取重复项,因此子查询中的不同具有没有效果。

假设我有一个 A 对象,它有一组四个 B 对象,我的分析是因为引入了集合,同时获取数据用于<​​/p>

session.createCriteria(A.class).list();

hibernate 在列表中填充四个引用,指向一个对象。因此,标准解决方案对我来说是失败的。

有人可以帮忙为这个案例想出一个解决方案吗?

编辑:我决定自己从不同的结果集中进行分页。另一种同样糟糕的方法可能是延迟加载 B 对象,但这需要对所有 A 对象进行单独查询以获取相应的 B 对象

最佳答案

考虑使用 DistinctRootEntity像这样的结果转换器

session.createCriteria(A.class)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();

更新

一对多关联的查询示例。

public Collection<Long> getIDsOfAs(int pageNumber, int pageSize) {
Session session = getCurrentSession();

Criteria criteria = session.createCriteria(A.class)
.setProjection(Projections.id())
.addOrder(Order.asc("id"));

if(pageNumber >= 0 && pageSize > 0) {
criteria.setMaxResults(pageSize);
criteria.setFirstResult(pageNumber * pageSize);
}

@SuppressWarnings("unchecked")
Collection<Long> ids = criteria.list();
return ids;
}

public Collection<A> getAs(int pageNumber, int pageSize) {
Collection<A> as = Collections.emptyList();

Collection<Long> ids = getIDsOfAs(pageNumber, pageSize);
if(!ids.isEmpty()) {
Session session = getCurrentSession();

Criteria criteria = session.createCriteria(A.class)
.add(Restrictions.in("id", ids))
.addOrder(Order.asc("id"))
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
@SuppressWarnings("unchecked")
as = criteria.list();
}

return as;
}

关于java - Hibernate - 分页的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9418268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com