2016-07-15 22 views
1

Ich habe so etwas wie das:JPA Kriterien mit ElementCollection

@Entity 
public class Person { 

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

wie kann ich wandeln die folgenden JPQL in eine Criteria Abfrage:

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

Antwort

1

Wenn Sie nicht wirklich brauchen, die Macht der LIKE und eine genaue Übereinstimmung ist genug, können Sie überprüfen, ob emailsemail enthält.

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(); 

Beachten Sie, dass p.get(Person_.emails) ein statisches Metamodell der Person Klasse erfordert. Wenn Sie das nicht haben, können Sie dieses Teil auf Kosten von Typ-Sicherheit durch p.get("emails") ersetzen.

Wenn Sie eine LIKE durchführen müssen, müssen Sie der Sammlung beitreten.

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