我需要通过在配对值列表中应用和条件来获取分页记录的表格,以下是解释
假设我有一个班级Billoflading
,其中有各种字段
表中的两个重要字段是
tenant
billtype
我有一个包含值为
的对列表[
{`tenant1`, `billtype1`},
{`tenant2`, `billtype2`},
{`tenant3`, `billtype3`},
....
]
我需要一个JPA查询,其中fetch就像 findByTenantAndBilltypeOrTenantAndBillTypeOr .....
在简单的SQL查询中它就像
Select * from `Billoflading` where
`tenant` = 'tenant1' and billtype = 'billtype1'
OR `tenant` = 'tenant2' and billtype = 'billtype2'
OR `tenant` = 'tenant3' and billtype = 'billtype3'
OR ......... so on..
我尝试编写JPA查询,如下所示
Page<Billoflading> findByTenantInAndBillTypeIn(List<String> tenants, List<String> billTypes, Page page);
但这也有交叉记录 即它给出了tenant1和billtype2,benant2和billtype 3等等的记录......结果集中不需要这些记录
任何人都可以解决这个问题,并帮助我找到一个简单的解决方案,如
Page<Billoflading> findByTenantAndBillTypeIn(Map<String, String> tenantsAndBilltyes, Page page);
我也准备好在JPA中进行原生查询所有我需要的是应该没有交叉,因为这是一个非常敏感的数据
我的另一个解决方法是获取记录并应用java 8过滤器,但是有效但是没有。页面中的记录减少
答案 0 :(得分:2)
JPA specification的第4.6.9节明确指出JPQL不支持这一点,至少不是 in-clause 的形式:
4.6.9在表达式中 在条件表达式中使用比较运算符[NOT] IN的语法如下:
in_expression ::= {state_valued_path_expression | type_discriminator} [NOT] IN { ( in_item {, in_item}* ) | (subquery) | collection_valued_input_parameter } in_item ::= literal | single_valued_input_parameter
state_valued_path_expression必须包含字符串,数字,日期,时间,时间戳或枚举值。
文字和/或输入参数值必须与类型中state_valued_path_expression的相同抽象模式类型相同。 (见4.12节)。
子查询的结果必须与类型中state_valued_path_expression的抽象模式类型相同。
它不会对元组进行操作。
您最好的选择可能是创建一个Specification
来构建您需要的AND
和OR
组合。见this blog article how to create Specifications