我将Vaadin Flow与Spring-data-jpa和Hibernate与DB2 / 400方言一起使用。我正在尝试使用分页查询,因为我的数据集可能非常大。我已经登录了Hibernate,以便可以看到Hibernate正在执行的语句。它适用于第一页,因为Hibernate查询仅要求提供前50条记录。但是,对于第二页,它要求100条记录,并过滤出前50条,但查询不会返回任何结果。 Hibernate生成的查询的一个稍微简化的版本是:
select * from (
select inner2_.*, rownumber() over(order by order of inner2_) as rownumber_ from (
select * from flxalll1 flxalll1x0_ where upper(flxalll1x0_.aoukey) like upper('%te%') fetch first 100 rows only
) as inner2_
) as inner1_ where rownumber_ > 50 order by rownumber_;
我自己使用IBMi Run SQL脚本工具运行了该脚本,并且未返回任何结果。但是,如果我只做内部两个选择:
select inner2_.*, rownumber() over(order by order of inner2_) as rownumber_ from (
select * from flxalll1 flxalll1x0_ where upper(flxalll1x0_.aoukey) like upper('%te%') fetch first 100 rows only
) as inner2_ ;
我得到了预期结果列表,尽管当然是所有结果,而不仅仅是最后50个。我做了更多的实验,发现(毫不奇怪)这项工作有效:
select * from (
select * from flxalll1
);
它列出了所有记录,但这是
select * from (
select * from (
select * from flxalll1
)
);
不产生任何记录。
显然,这没有任何意义,但是我想知道DB2 / 400是否存在问题,因为它不会对两个嵌套的子选择或类似的东西进行选择,这就是原因为什么我的原始查询不返回任何记录?
解决问题可能会很棘手,但至少到目前为止,我只是试图找出问题所在。
答案 0 :(得分:0)
我现在通过不使用我上面的评论中提到的(IBMi)逻辑,而是通过允许spring数据jpa执行UNION来解决了我的问题。我为我的10个表创建了一个抽象超类,并更改了其Java类声明以对其进行扩展。
我对这篇文章以及Patrice Blanchardie的回答表示感激: