关于它有很多问题,但我找不到具体的答案。 我是Hibernate的新手,并试图实现分页。 让我们说我有两个实体:父和子,定义如下:
@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。
我想获得父母 按名称排序的第一页,其中每页为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是在连接表上执行的,而不是在父列表上执行的(正如我希望的那样)。
我的问题是在“父项”列表中获取分页的查询应该是什么,而不是在联接表上?
答案 0 :(得分:1)
分页不适用于已连接的集合,因为它会计算满足where
谓词的所有行(Hibernate与此无关,它是数据库的工作方式,例如Oracle rownum
)。
通常的方法是使用子查询,以便rownum
(或使用的数据库中的等价物)仅应用于一个表的选定行(或者连接到一个表中的表)关系)。
在HQL中:
select p from Parent p were p in (select c.parent from Child c where ...)
criteria equivalent可以用类似的方式构建。
答案 1 :(得分:0)
您已经使用c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
查找在数据来自数据库后执行的不同Parent
。在注释此行后,您将获得正确的输出但是parrent会重复。
在评估您的问题后,我在stackoverflow上找到了与您的问题相关的链接。它会帮助你。你可以关注链接。 Stackoverflow Criteria Pagging