我有这样的东西:
@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/