Pagination Eben order by和oneToMany属性以及分页

Pagination Eben order by和oneToMany属性以及分页,pagination,sql-order-by,one-to-many,ebean,Pagination,Sql Order By,One To Many,Ebean,我正在尝试获取分页订单,按当前版本的存档日期排序currentVersion=true 以下是Order类: @Entity public class Offer extends Model { @Id public Long id; .... @OneToMany(mappedBy = "offer", fetch = FetchType.EAGER) public List<Version> versions; ...

我正在尝试获取分页订单,按当前版本的存档日期排序currentVersion=true

以下是Order类:

@Entity
public class Offer extends Model {
    @Id   
    public Long id;
    ....
    @OneToMany(mappedBy = "offer", fetch = FetchType.EAGER)
    public List<Version> versions; 
    ...  
}
以下是我在eBean文档中找到的获取代码:

 Query<Offre> query = Ebean.find(Offer.class);

 List<Offer> offers = query.fetch("versions")
                               .where()
                               .eq("versions.currentVersion", true)
                               .orderBy("versions.creation desc nulls last")
                               .setFirstRow(0)
                               .setMaxRows(10)
                               .findPagedList().getList();
下面是预期的SQL

SELECT * FROM
  (SELECT     /*+ FIRST_ROWS(10) */     rownum rn_,  a.*  FROM
    (SELECT t0.id c0,
       ... 
      t0.OPTLOCK c32
    FROM offer t0
    INNER JOIN version t1 on t0.id = t1.OFFER_ID 
    ORDER BY t1.creation
    ) a
  WHERE rownum <= 10
  ) ; --bind()
下面是实际的SQL

First one:

SELECT *
FROM
  (SELECT
    /*+ FIRST_ROWS(10) */
    rownum rn_,
    a.*
  FROM
    ( SELECT DISTINCT t0.id c0,
      ...
      t0.id
      ...
    FROM offer t0
    JOIN versions u1  ON u1.OFFER_ID = t0.id
    WHERE u1.current_version = true
    AND u1.current_version   = true
    ORDER BY t0.id
    ) a
  WHERE rownum <= 10
  ) ; 

Second one : 

SELECT t0.OFFER_ID c0,
  t0.id c1,
  ...
  t0.creation c3,
  ...
  t0.current_version c12,
  ...
  t0.OFFER_ID c30,
  ...
FROM versions t0
WHERE (t0.OFFER_ID) IN (990,991,992,993,994,995,996,997,998,999)
ORDER BY t0.creation; 
问题:为了获得预期的SQL,我需要更改什么

非常感谢你的帮助

使用的版本: Eben 7.6.1从第2.5.14场比赛中,我找到了一个散步的地方:

而不是

List<Offer> offers = query.fetch("versions")
                               .where()
                               .eq("versions.currentVersion", true)
                               .orderBy("versions.creation desc nulls last")
                               .setFirstRow(0)
                               .setMaxRows(10)
                               .findPagedList().getList();
我发现:

List<Offer> offers = query.fetch("versions")
                               .where()
                               .eq("versions.currentVersion", true)
                               .orderBy("u1.creation desc") // <-- line with the change
                               .setFirstRow(0)
                               .setMaxRows(10)
                               .findPagedList().getList();
我确保报价和版本之间的连接只进行一次,然后假设版本连接别名为u1

至少,它正在发挥作用

再见

我发现有人在附近散步:

而不是

List<Offer> offers = query.fetch("versions")
                               .where()
                               .eq("versions.currentVersion", true)
                               .orderBy("versions.creation desc nulls last")
                               .setFirstRow(0)
                               .setMaxRows(10)
                               .findPagedList().getList();
我发现:

List<Offer> offers = query.fetch("versions")
                               .where()
                               .eq("versions.currentVersion", true)
                               .orderBy("u1.creation desc") // <-- line with the change
                               .setFirstRow(0)
                               .setMaxRows(10)
                               .findPagedList().getList();
我确保报价和版本之间的连接只进行一次,然后假设版本连接别名为u1

至少,它正在发挥作用


再见

从播放2.4迁移到播放2.5后出现的问题。在以前的版本中,设置setFirstRow0/setMaxRows10并不意味着自动拥有ORDERBY t0.id子句。我可以按原始SQL进行排序。现在它不再工作了。问题发生在从Play 2.4迁移到Play 2.5之后。在以前的版本中,设置setFirstRow0/setMaxRows10并不意味着自动拥有ORDERBY t0.id子句。我可以按原始SQL进行排序。现在它不再工作了。