gpt4 book ai didi

java - 有没有比使用 DetachedCriteria 进行分页更好的方法?

转载 作者:行者123 更新时间:2023-11-30 08:44:43 25 4
gpt4 key购买 nike

使用Hibernate 的Criteria api 进行排序和分页有一个很大的限制,它需要从数据库中检索不同的结果。 api 提供的工具(如 DistinctRootTransformer)将不起作用,因为它是在从 db 检索实体之后应用的,因此会破坏分页和排序。获得具有关联限制的查询的不同结果的唯一方法是通过 DetachedCriteria 限制结果集。 :

DetachedCriteria dc = DetachedCriteria.forClass(Household.class, "h")
.createAlias("cats", "c", JoinType.LEFT_OUTER_JOIN)
.add(Restrictions.or(
Restrictions.isEmpty("cats"),
Restrictions.ne("c.name", "Sylvester")
))
.setProjection(Projections.distinct(Projections.property("h.id")));

Criteria criteria = session.createCriteria(Household.class)
.add(Property.forName("id").in(dc));

...apply paging, sorting and filtering to criteria.

有没有人知道更好的方法,例如省略子查询并在不破坏分页的情况下使用连接?我的目标是找到一个可重用的解决方案,例如仅将条件传递给另一个应用分页、排序和过滤的方法。

更新:

以下代码有效。由于连接,我必须使用 Resulttransformer 来获得不同的结果。但是,它在排序和分页之后应用。

Criteria criteria = session.createCriteria(Household.class)
.createAlias("cats", "c", JoinType.LEFT_OUTER_JOIN)
.add(Restrictions.ne("c.name","Sylvester"))
.setFirstResult((page - 1) * pagesize)
.setMaxResults(pagesize)
.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);

例如调试 sql 数据库将返回类似的内容:

household_id=1,...cat_ids={1,2};household_id=1,...cat_ids={1,2};household_id=2,...cat_ids={1};

在此示例中,将页面大小设置为 1 并查看页面 2 应该返回 uid 2,因为只有两个不同的用户。但是正如您在数据库输出中看到的那样,它返回了错误的 uid 1,因为 Resulttransformers 会在之后启动。

最佳答案

如果您在某种方法中创建 DetachedCriteria 然后使用它,您可以尝试使用类似的方法将 DetachedCriteria 转换为 Criteria:

DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Your.class);
// then add all your restrictions and convert
Criteria criteria = detachedCriteria.getExecutableCriteria(session);

然后应用分页

criteria.setFirstResult(pageable.getPage() * pageable.getSize());
criteria.setMaxResults(pageable.getSize());

然后执行标准。例如:

List<T> result = criteria.list();

关于java - 有没有比使用 DetachedCriteria 进行分页更好的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33670058/

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