2016-07-15 103 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);