Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate中带有联接表的分页_Java_Mysql_Hibernate_Pagination - Fatal编程技术网

Java Hibernate中带有联接表的分页

Java Hibernate中带有联接表的分页,java,mysql,hibernate,pagination,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;

关于这个问题有很多问题,但我找不到具体的答案。 我不熟悉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是在联接表上执行的,而不是在我希望的父列表上执行的


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

分页不适用于联接的集合,因为它统计满足where谓词Hibernate的所有行。例如,这与数据库的工作方式无关

克服这一问题的通常方法是使用子查询,以便所用数据库中的rownum或等效项仅应用于一个表的选定行或处于to-one关系中的联接表

在HQL中:

select p from Parent p were p in (select c.parent from Child c where ...)
可以以类似的方式构建。

您已使用c.setResultTransformerCriteria.DISTINCT\u ROOT\u实体来查找不同的父项,该实体在数据来自数据库后执行。注释这一行后,您将获得正确的输出,但部分重复

在对您的问题进行评估后,我在stackoverflow上找到了一个与您的问题相关的链接。这将有助于您。请访问以下链接。

您能为我正在使用的mysql分页提供最有效的sql查询吗?根据您在问题页面中通过有孩子的家长提供的内容,最有效的查询应该与我在回答中提供的内容完全相同:从家长选择p在选择c中是p。从孩子选择c中是p。