Pagination Eben order by和oneToMany属性以及分页
我正在尝试获取分页订单,按当前版本的存档日期排序currentVersion=true 以下是Order类: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; ...
@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进行排序。现在它不再工作了。