From a2fcbbaa59ce9c71a031fc931502cc7d4e8dc067 Mon Sep 17 00:00:00 2001 From: jensp Date: Wed, 7 Feb 2018 14:01:52 +0000 Subject: [PATCH] =?UTF-8?q?CCM=20NG:=20Variante=20der=20findById=20Methode?= =?UTF-8?q?=20f=C3=BCr=20fetchJoins=20erstellen=20erstellen=20(#2805)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@5254 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: 13260cd7cd82e12af199f63e574f1725c064f1a5 --- .../core/AbstractEntityRepository.java | 35 ++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) diff --git a/ccm-core/src/main/java/org/libreccm/core/AbstractEntityRepository.java b/ccm-core/src/main/java/org/libreccm/core/AbstractEntityRepository.java index 33932d7c4..2264390f9 100644 --- a/ccm-core/src/main/java/org/libreccm/core/AbstractEntityRepository.java +++ b/ccm-core/src/main/java/org/libreccm/core/AbstractEntityRepository.java @@ -28,6 +28,7 @@ import java.util.Optional; import javax.inject.Inject; import javax.persistence.EntityGraph; import javax.persistence.EntityManager; +import javax.persistence.NoResultException; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; @@ -123,12 +124,12 @@ public abstract class AbstractEntityRepository implements Serializable { * repository. */ public abstract Class getEntityClass(); - + /** * Used by some methods to create queries using the JPA Criteria API. - * - * @return The name of the ID attribute/property for entities managed by - * a repository. + * + * @return The name of the ID attribute/property for entities managed by a + * repository. */ public abstract String getIdAttributeName(); @@ -176,6 +177,32 @@ public abstract class AbstractEntityRepository implements Serializable { hints)); } + @Transactional(Transactional.TxType.REQUIRED) + public Optional findById(final K entityId, + final String... fetchJoins) { + + Objects.requireNonNull(entityId); + + final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); + final CriteriaQuery criteriaQuery = builder + .createQuery(getEntityClass()); + final Root from = criteriaQuery.from(getEntityClass()); + criteriaQuery.from(getEntityClass()); + for (final String fetchJoin : fetchJoins) { + from.fetch(fetchJoin); + } + + criteriaQuery + .where(builder.equal(from.get(getIdAttributeName()), entityId)); + + final TypedQuery query = entityManager.createQuery(criteriaQuery); + try { + return Optional.of(query.getSingleResult()); + } catch (NoResultException ex) { + return Optional.empty(); + } + } + /** * Finds all instances of the entity of the type this repository is * responsible for.