使用带分页的oneToMany属性的ebean顺序

时间:2017-05-22 12:42:33

标签: pagination sql-order-by one-to-many ebean

我正在尝试获取分页顺序,按当前版本的cration日期排序(currentVersion = true)

以下是Order类:

@Entity
public class Offer extends Model {
    @Id   
    public Long id;
    ....
    @OneToMany(mappedBy = "offer", fetch = FetchType.EAGER)
    public List<Version> versions; 
    ...  
}

这是版本类

@Entity
public class Version extends Model {

    @Id   
    public Long id;
    @ManyToOne
    @JoinColumn(name = "OFFER_ID")
    public Offer offer;
    public Boolean currentVersion = false;
    public Date creation;
    ...  
}

以下是我在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?

非常感谢您的帮助

使用的版本: ebean 7.6.1 from play 2.5.14

1 个答案:

答案 0 :(得分:1)

我找到了一个随处:

而不是

div

我找到了:

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

我确保offer和版本之间的连接只进行一次,而不是假设版本连接别名是u1。

至少,它正在做这份工作。

再见