gpt4 book ai didi

java - 使用连接表在 Hibernate 中分页

转载 作者:可可西里 更新时间:2023-11-01 06:51:00 26 4
gpt4 key购买 nike

有很多关于它的问题,但我找不到具体的答案。我是 Hibernate 的新手,正在尝试实现分页。假设我有两个实体:Parent 和 Child 定义如下:

@Entity
@Table(name="Parents")
public class Parent{

@Id
@Column(name="id", length=255)
private String id;

@Column(name="name", length=255)
protected String name;

@OneToMany
@JoinTable(name="parents_children", joinColumns = @JoinColumn( name="parent_id"), inverseJoinColumns = @JoinColumn( name="child_id"))
@LazyCollection(LazyCollectionOption.FALSE)
protected List<Child> children;
}

@Entity
@Table(name="children")
public class Child {

@Id
@Column(name="id", length=255)
protected String id;

@Column(name="name", length=255)
protected String name;


}

每个属性还根据需要具有 getter 和 setter。

我想获取 Parents 按姓名排序第一页,其中每页有 10 个结果 .

所以我从:

    Session session = HibernateUtil.getSessionFactory().openSession();
Criteria c = session.createCriteria(Parent.class, "p");
c.createAlias("q.children", "ch");
c.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
c.addOrder(Order.desc("name"));
c.setMaxResults(10);
c.setFirstResult(0);
List<Parent> result = c.list();
session.close();

这段代码没有按预期工作,因为 setMaxResults 是在连接表上执行的,而不是在父表上执行的(正如我希望的那样)。

我的问题是,要在 Parents 列表上而不是在联接表上进行分页,查询应该是什么?

最佳答案

分页不适用于连接的集合,因为它计算所有满足 where 谓词的行(Hibernate 与此无关,这是数据库的工作方式,例如 Oracle rownum ) .

克服这个问题的通常方法是使用子查询,以便 rownum(或所用数据库中的等效项)仅应用于一个表(或位于一对一关系)。

在 HQL 中:

select p from Parent p were p in (select c.parent from Child c where ...)

criteria equivalent可以用类似的方式构建。

关于java - 使用连接表在 Hibernate 中分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31581978/

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