【问题标题】:JPA select IN multiple fields [duplicate]JPA在多个字段中选择[重复]
【发布时间】:2020-07-27 00:34:16
【问题描述】:

是否可以在 jpql 中实现类似下面的 mySQL?

select * from PERSON p where (p.name, p.country)
IN (('Bryan', 'Netherlands'), ('Candice', 'New Zealand'), ...);

其中“...”是列表的延续。我想创建一个新实体列表作为值的占位符,但我不确定如何使其工作。我正在考虑以下内容:

    @Query(
        value = "select p from Person p where (p.name, p.country) in :personList")
    List<Person> findPersonsIn(@Param("personList") List<Person> personList);

我知道这是非常不正确的,但我希望有人能阐明如何在 JPA 或 JDBC 中实现上述 MySQL 语句。

【问题讨论】:

标签: java mysql spring jpa jdbc


【解决方案1】:

是的。使用 AND 运算符:

select * from PERSON p where ( p.name IN ('Bryan', 'Netherlands') ) AND ( p.country
IN ('Candice', 'New Zealand') ), ...);

【讨论】:

  • 这在语义上与我的查询不同。这将获得所有名称,然后再次使用所有国家/地区对其进行过滤。我正在寻找的是一个过滤条件的元组,即名称“布莱恩”和国家“荷兰”必须存在于一行中才能有效。对于您的情况,如果 ('Bryan', 'New Zealand') 存在另一条记录,这也会弹出,这不是我想要的。
【解决方案2】:

JPA 中不提供 IN 子句中的多个列

@Query(
            value = "select p from Person p where (p.name, p.country) in :personList")
        List<Person> findPersonsIn(@Param("personList") List<Person> personList);

你能试试下面的代码吗

 @Query(
        value = "select p from Person p where p.name in (:personName) or p.country in (:personCountry) ")
    List<Person> findPersonsIn(@Param("personName") List<String> personName,@Param("personCountry") List<String> personCountry);

或者您可以使用“querydsl”更轻松地编写查询

【讨论】:

  • 感谢您的回答。但我需要有一个严格的过滤标准,其中记录必须包含(人+国家)的唯一键。组合是不可接受的,即根据我上面的例子,如果 ('Bryan' , 'New Zealand') 存在,它不应该出现。
猜你喜欢
  • 2016-01-15
  • 2011-02-13
  • 2014-09-09
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 2021-03-09
  • 1970-01-01
  • 2021-08-07
相关资源
最近更新 更多