Das JPA-Citeria API ermöglicht eine standardisierte und typsichere Erstellung von objektorientierten Abfragen in Java. Dieser Beitrag erläutert wie Join-Abfragen beeinflusst werden können.
Die Join Methode macht zwar per default einen „inner join“, dieses Verhalten lässt sich jedoch durch die Übergabe eines JoinType Objektes an die Join-Methode beeinflussen .
Unser bekanntes Beispiel für ein Join durch eine CriteriaQuery wird dazu wie folgt angepasst:
EntityManager em = entityManagerFactory.createEntityManager(); CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class); Root person = criteriaQuery.from(Person.class); // Join-Methode wird ein JoinType zur Steuerung übergeben SetJoin adresses = person.join(Person_.adresses, JoinType.LEFT); criteriaQuery .select(person) .where( criteriaBuilder.equal(adresses.get(Address_.street), "Weinheimer str.") ); criteriaQuery.select(person); List resultList = em.createQuery(criteriaQuery).getResultList();
Die obige Abfrage würde in JPQL wie folgt ausehen:
select p from Person p left join p.adresses a where a.street = 'Weinheimer str.';
Ein Fetch Join wird durch den Aufruf der fetch-Methode erreicht. Die fetch-Methode lässt sich an einem Root- oder Join-Object aufrufen. Die Methode sorgt dafür, dass alle referenzierten Attribute oder Assoziationen in der Abfrage geladen werden.
EntityManager em = entityManagerFactory.createEntityManager(); CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder(); CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(Person.class); Root person = criteriaQuery.from(Person.class); person.fetch(Person_.adresses); criteriaQuery.select(person); List resultList = em.createQuery(criteriaQuery).getResultList();
Das äquivalente JPQL Statement sieht wie folgt aus:
select p from Person p join fetch p.adresses
Einsortiert unter:Java EE, Java Persistence Tagged: Criteria, Hibernate, inner join, join, JPA 2.0, left join, persistence
