在条款中列出一对条件

时间:2018-02-16 04:16:04

标签: mysql jpa spring-data-jpa

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

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

  1. tenant
  2. billtype
  3. 我有一个包含值为

    的对列表
    [
       {`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过滤器,但是有效但是没有。页面中的记录减少

1 个答案:

答案 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_pa​​th_expression必须包含字符串,数字,日期,时间,时间戳或枚举值。

     

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

     

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

它不会对元组进行操作。

您最好的选择可能是创建一个Specification来构建您需要的ANDOR组合。见this blog article how to create Specifications