Java Hibernate分页查询不返回DB2/400方言的记录
我正在使用vaadinflow和Spring数据jpa,以及带有DB2/400方言的Hibernate。我正在尝试使用分页查询,因为我的数据集可能非常大。我已登录Hibernate,以便查看Hibernate正在执行的语句。它适用于第一页,因为Hibernate查询只要求前50条记录。然而,对于第二个页面,它要求100条记录并过滤掉前50条记录,但查询不返回任何结果。Hibernate生成的查询有一个稍微简化的版本:Java Hibernate分页查询不返回DB2/400方言的记录,java,sql,hibernate,spring-data-jpa,db2-400,Java,Sql,Hibernate,Spring Data Jpa,Db2 400,我正在使用vaadinflow和Spring数据jpa,以及带有DB2/400方言的Hibernate。我正在尝试使用分页查询,因为我的数据集可能非常大。我已登录Hibernate,以便查看Hibernate正在执行的语句。它适用于第一页,因为Hibernate查询只要求前50条记录。然而,对于第二个页面,它要求100条记录并过滤掉前50条记录,但查询不返回任何结果。Hibernate生成的查询有一个稍微简化的版本: select * from ( select inner2_.*, rown
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运行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是否有问题,因为它不会使用两个嵌套的子选择来执行选择,或者类似的操作,这就是我的原始查询不返回任何记录的原因吗
解决这个问题可能很棘手,但至少目前我只是想找出问题所在。我现在已经解决了我的问题,没有使用我上面评论中提到的(IBMi)逻辑,而是允许spring data jpa进行联合。我为我的10个表创建了一个抽象超类,并更改了它们的Java类声明以扩展它 我要感谢这篇文章和帕特里斯·布兰查迪的回答:
我现在已经解决了我的问题,没有使用上面我的评论中提到的(IBMi)逻辑,而是允许spring数据jpa进行联合。我为我的10个表创建了一个抽象超类,并更改了它们的Java类声明以扩展它 我要感谢这篇文章和帕特里斯·布兰查迪的回答: 在与一位(非程序员)同事聊天时,他提到了一些让我思考的事情。在我的(真实)示例中,表flxalll1(用IBMi术语)是一个逻辑表(结合了视图和索引),其中10个其他非常类似的表联合在一起。如果我在其他逻辑上尝试三重嵌套select,那么它可以正常工作,返回记录。所以我认为这仅仅是因为联合而不起作用。只是和一位(非程序员)同事聊天,他提到了一些让我思考的事情。在我的(真实)示例中,表flxalll1(用IBMi术语)是一个逻辑表(结合了视图和索引),其中10个其他非常相似的表联合在一起。如果我在其他逻辑上尝试三重嵌套select,那么它可以正常工作,返回记录。所以我认为这仅仅是因为工会的原因而不起作用。