JPA 2.0 Criteria API How To – Join Type und Fetch Join

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
Short URL for this post: http://wp.me/p4nxik-1CF
This entry was posted in Java EE, Java Persistence and tagged , , , , , , . Bookmark the permalink.

Leave a Reply