jul*_*_am 6 java mysql pagination hibernate
关于它有很多问题,但我找不到具体的答案.我是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;
}
Run Code Online (Sandbox Code Playgroud)
每个属性还根据需要具有getter和setter.
我希望得到按姓名排序的父母的第一页,其中每页为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();
Run Code Online (Sandbox Code Playgroud)
此代码无法按预期工作,因为setMaxResults是在连接表上执行的,而不是在父列表上执行的(正如我希望的那样).
我的问题是什么应该是在父类列表上而不是在连接表上获取分页的查询?
分页不适用于连接集合,因为它会计算满足谓词的所有行where(Hibernate 与此无关,这是数据库的工作方式,例如Oraclerownum)。
克服这一问题的常用方法是使用子查询,以便将子rownum查询(或所使用的数据库中的等效项)应用于仅一个表(或处于一对一关系的连接表)的选定行。
在 HQL 中:
select p from Parent p were p in (select c.parent from Child c where ...)
Run Code Online (Sandbox Code Playgroud)
可以用类似的方式构建等效标准。