java - 带有 ElementCollection 的 JPA 条件

标签 java jpa jpql criteria-api

我有这样的东西:

@Entity
public class Person {

    @ElementCollection
    private List<String> emails;
    ...
}

如何将以下 JPQL 转换为条件查询:

select p from Person p
where exists (
    select 1 
    from p.emails e
    where e like :email
)

最佳答案

如果您真的不需要 LIKE 的强大功能并且完全匹配就足够了,您可以检查 emails 是否包含 email

CriteriaBuilder builder = entityManager.getCriteriaBuilder();
CriteriaQuery<Person> criteria = builder.createQuery(Person.class);
Root<Person> p = criteria.from(Person.class);
criteria.select(p);


Expression<List<String>> emails = p.get(Person_.emails);
criteria.where(builder.isMember("[email address]", emails));


TypedQuery<Person> tq = entityManager.createQuery(criteria);
List<Person> persons = tq.getResultList();

请注意,p.get(Person_.emails) 需要 Person 类的静态元模型。如果没有,您可以用 p.get("emails") 替换该部分,但要牺牲类型安全性。

如果您确实需要执行LIKE,您将必须加入 Collection 。

Join<Person, String> emailJoin = p.join(Person_.emails);
criteria.where(builder.like(emailJoin, "[email address]"));
criteria.distinct(true);

关于java - 带有 ElementCollection 的 JPA 条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38386301/

相关文章:

java - 无法从 jar 读取输入

java - JPA 持久保存与现有实体有关系的新实体

java - JPA 查询超时参数被忽略,但 @Transaction 注释有效

java - Spring Data JPA删除 native 查询抛出异常

java - hibernate 查询列表 : empty or null?

从列表中选择 JPA

java - 使用 Architecture Components MVVM 进行身份验证,将 token 从 Repository 传递到 ViewModel

java - 我无法让 ListView 显示文件夹中的文件名

java - 使用多线程 RxJava 的响应式(Reactive)拉取

jpa - 如何在 JPQL 中进行 "deep"提取连接?