条件对列表的 In 子句

Kal*_*han 4 mysql jpa spring-data-jpa

有一个表,我需要通过在配对值列表中应用和条件来获取分页记录,下面是解释

假设我有一个类Billoflading,其中有各种字段表中的两个重要字段是

  1. tenant
  2. billtype

我有一个包含值的对列表

[
   {`tenant1`, `billtype1`},
   {`tenant2`, `billtype2`},
   {`tenant3`, `billtype3`},
   ....
  ]
Run Code Online (Sandbox Code Playgroud)

我需要一个 JPA 查询,其中的获取将类似于 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..
Run Code Online (Sandbox Code Playgroud)

我尝试编写 JPA 查询如下

Page<Billoflading> findByTenantInAndBillTypeIn(List<String> tenants, List<String> billTypes, Page page);
Run Code Online (Sandbox Code Playgroud)

但这也有交叉记录,即它提供了tenant1和billtype2、benant2和billtype 3等的记录...结果集中不需要这些记录

任何人都可以解决这个问题并帮助我找到一个简单的解决方案,例如

Page<Billoflading> findByTenantAndBillTypeIn(Map<String, String> tenantsAndBilltyes, Page page);
Run Code Online (Sandbox Code Playgroud)

我还准备好了 JPA 中的本机查询,我所需要的只是不应该有交叉,因为这是一个非常敏感的数据

我的另一个解决方法是获取记录并应用 java 8 过滤器,这可以工作,但不行。页面中的记录数减少

Jen*_*der 5

JPA 规范的第 4.6.9 节明确指出,JPQL 不支持这一点,至少不以in-clause的形式支持:

4.6.9 In 表达式 在条件表达式中使用比较运算符 [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
Run Code Online (Sandbox Code Playgroud)

state_valued_pa​​th_expression 必须具有字符串、数字、日期、时间、时间戳或枚举值。

文字和/或输入参数值必须与 type 中的 state_valued_pa​​th_expression 的抽象模式类型相同。(参见第 4.12 节)。

子查询的结果必须与 type 中的 state_valued_pa​​th_expression 的抽象模式类型相同。

它只是不适用于元组。

您最好的选择可能是创建一个来构建您需要Specification的组合。请参阅此博客文章如何创建ANDORSpecifications