Hibernate中的分页与连接表

时间:2015-07-23 08:26:33

标签: java mysql hibernate pagination

关于它有很多问题,但我找不到具体的答案。 我是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是在连接表上执行的,而不是在父列表上执行的(正如我希望的那样)。

我的问题是在“父项”列表中获取分页的查询应该是什么,而不是在联接表上?

2 个答案:

答案 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