用于一对条件列表的子句

Posted

技术标签:

【中文标题】用于一对条件列表的子句【英文标题】:In clause for a list of pair of conditions 【发布时间】:2018-02-16 04:16:04 【问题描述】:

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

假设我有一个课程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 过滤器,这可行,但不行。页面中的记录减少了

【问题讨论】:

【参考方案1】:

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

【讨论】:

感谢您的建议,我将尝试使用标准列表以及标准内的列表,但是一个快速的问题,您推荐标准列表还是标准内的列表?提前致谢 对不起,我不明白你对这两个选项的意思。 哦,很抱歉造成误解,符合标准的解决方案正在运行,我能够找到所需的结果,感谢您一直以来的宝贵意见

以上是关于用于一对条件列表的子句的主要内容,如果未能解决你的问题,请参考以下文章

MySQL(DQL部分)

MySQL(DQL部分)

Firestore:多个条件 where 子句

MySQL之指定过滤条件(HAVING)

Linq to SQL 多个条件 where 子句

PL/SQL 和条件 FROM 子句