【问题标题】:Pagination in Hibernate with joined tables在 Hibernate 中使用连接表进行分页
【发布时间】:2015-10-13 10:34:56
【问题描述】:

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

我的问题是查询应该是在父母列表上而不是在连接表上获取分页?

【问题讨论】:

    标签: java mysql hibernate pagination


    【解决方案1】:

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

    解决这个问题的常用方法是使用子查询,以便rownum(或所用数据库中的等效项)仅应用于一个表(或一对一关系的连接表)的选定行.

    在 HQL 中:

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

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

    【讨论】:

    • 能否提供最高效的分页sql查询(我用的是mysql)?
    • 根据您在问题中提供的内容(通过有孩子的父母的页面),最有效的查询应该正是我在答案中提供的内容:select p from Parent p were p in (select c.parent from Child c)
    【解决方案2】:

    您已使用c.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) 查找不同的Parent,它在数据来自数据库后执行。注释此行后,您将获得正确的输出,但parrent 重复。

    评估您的问题后,我在 stackoverflow 上找到了与您的问题相关的链接。它会帮助你。你到下面的链接。 Stackoverflow Criteria Pagging

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 1970-01-01
      • 2012-06-17
      • 2015-03-15
      • 1970-01-01
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多