2016-07-15 76 views
1

我有类似的东西:JPA标准与ElementCollection

@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

如果你并不真正需要的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);