带有ElementCollection的JPA标准

时间:2016-07-15 00:51:15

标签: 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
)

1 个答案:

答案 0 :(得分:1)

如果你真的不需要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,则必须加入该集合。

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