Java Hibernate分页查询不返回DB2/400方言的记录

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

我正在使用vaadinflow和Spring数据jpa,以及带有DB2/400方言的Hibernate。我正在尝试使用分页查询,因为我的数据集可能非常大。我已登录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运行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,那么它可以正常工作,返回记录。所以我认为这仅仅是因为工会的原因而不起作用。