summaryrefslogtreecommitdiffstats
path: root/src/main/java/nu/xss/jpa/dao/GenericJpaDao.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/nu/xss/jpa/dao/GenericJpaDao.java')
-rw-r--r--src/main/java/nu/xss/jpa/dao/GenericJpaDao.java54
1 files changed, 50 insertions, 4 deletions
diff --git a/src/main/java/nu/xss/jpa/dao/GenericJpaDao.java b/src/main/java/nu/xss/jpa/dao/GenericJpaDao.java
index 9e2babb..21ee630 100644
--- a/src/main/java/nu/xss/jpa/dao/GenericJpaDao.java
+++ b/src/main/java/nu/xss/jpa/dao/GenericJpaDao.java
@@ -5,15 +5,20 @@ import java.lang.reflect.ParameterizedType;
import java.util.List;
import javax.persistence.EntityManager;
+import javax.persistence.NoResultException;
+import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
+import nu.xss.jpa.entity.TypedEntity;
+
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public abstract class GenericJpaDao<E, K> implements Dao<E, K>, Serializable {
+public abstract class GenericJpaDao<E extends TypedEntity<K>, K> implements
+ Dao<E, K>, Serializable {
private static final long serialVersionUID = 4998055731089977476L;
protected final Logger logger = LoggerFactory.getLogger(this.getClass());
@@ -54,11 +59,52 @@ public abstract class GenericJpaDao<E, K> implements Dao<E, K>, Serializable {
}
public List<E> findAll() {
- CriteriaBuilder cb = entityManager.getCriteriaBuilder();
- CriteriaQuery<E> c = cb.createQuery(this.entity);
+ return find(createSimpleQuery());
+ }
+
+ protected CriteriaBuilder getCriteriaBuilder() {
+ return entityManager.getCriteriaBuilder();
+ }
+
+ protected CriteriaQuery<E> createQuery() {
+ CriteriaQuery<E> c = getCriteriaBuilder().createQuery(this.entity);
+ return c;
+ }
+
+ protected CriteriaQuery<E> createSimpleQuery() {
+ CriteriaQuery<E> c = getCriteriaBuilder().createQuery(this.entity);
Root<E> root = c.from(this.entity);
c.select(root);
- return entityManager.createQuery(c).getResultList();
+ return c;
}
+ protected List<E> find(CriteriaQuery<E> query) {
+ return entityManager.createQuery(query).getResultList();
+ }
+
+ protected E findSingle(CriteriaQuery<E> query) {
+ return entityManager.createQuery(query).getSingleResult();
+ }
+
+ protected E findSingleOrNull(CriteriaQuery<E> query) {
+ try {
+ return findSingle(query);
+ } catch (final NoResultException e) {
+ return null;
+ } catch (final NonUniqueResultException e) {
+ logger.error("Found more than one result.. return first one");
+ return null;
+ }
+ }
+
+ protected E findSingleFirstOrNull(CriteriaQuery<E> query) {
+ try {
+ return findSingle(query);
+ } catch (final NoResultException e) {
+ return null;
+ } catch (final NonUniqueResultException e) {
+ logger.warn("Found more than one result.. return first one");
+ return find(query).get(0);
+ }
+ }
}