diff options
Diffstat (limited to 'src/main/java/nu/xss/jpa/dao/GenericJpaDao.java')
-rw-r--r-- | src/main/java/nu/xss/jpa/dao/GenericJpaDao.java | 156 |
1 files changed, 88 insertions, 68 deletions
diff --git a/src/main/java/nu/xss/jpa/dao/GenericJpaDao.java b/src/main/java/nu/xss/jpa/dao/GenericJpaDao.java index 399763a..0c06505 100644 --- a/src/main/java/nu/xss/jpa/dao/GenericJpaDao.java +++ b/src/main/java/nu/xss/jpa/dao/GenericJpaDao.java @@ -3,8 +3,9 @@ package nu.xss.jpa.dao; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; +import java.util.HashSet; import java.util.List; - +import java.util.Set; import javax.persistence.EntityManager; import javax.persistence.NoResultException; @@ -13,9 +14,13 @@ import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import nu.xss.jpa.entity.TypedEntity; +import nu.xss.jpa.query.Pagination; +import nu.xss.jpa.query.Sort; +import nu.xss.jpa.query.filter.Filter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -46,20 +51,20 @@ public abstract class GenericJpaDao<E extends TypedEntity<K>, K> implements } public void save(E entity) { - logger.info("Persist Entity: {}.", entity.toString()); entityManager.persist(entity); logger.info("Saved entity: {}.", entity.toString()); } public void merge(E entity) { - logger.info("Merge Entity: {}.", entity.toString()); entityManager.merge(entity); - logger.info("Saved entity: {}.", entity.toString()); + logger.info("Updated unmanaged entity: {}.", entity.toString()); } public void delete(E entity) { - E persistentEntity = findById(entity.getId()); - entityManager.remove(persistentEntity); + final E persistentEntity = findById(entity.getId()); + if (persistentEntity != null) { + entityManager.remove(persistentEntity); + } logger.info("Deleted entity: {}.", entity.toString()); } @@ -67,86 +72,71 @@ public abstract class GenericJpaDao<E extends TypedEntity<K>, K> implements return entityManager.find(entity, id); } - public List<E> findAll() { - return find(null); + @Override + public int count() { + // TODO Auto-generated method stub + return 0; } - public List<E> findAll(int count) { - return find(null, count); + @Override + public int count(Filter... filter) { + // TODO Auto-generated method stub + return 0; } - public List<E> findAll(int count, int offset) { - return find(null, count, offset); + @Override + public List<E> findAll() { + return find(null, null, null); } - public List<E> findAll(String sortColumn) { - return find(null, sortColumn); + @Override + public List<E> findAll(Sort sort) { + return find(null, sort, null); } - public List<E> findAll(int count, String sortColumn) { - return find(null, count, sortColumn); + @Override + public List<E> findAll(Pagination pagination) { + return find(null, null, pagination); } - public List<E> findAll(int count, int offset, String sortColumn) { - return find(null, count, offset, sortColumn); + @Override + public List<E> findAll(Sort sort, Pagination pagination) { + return find(null, sort, pagination); } - public List<E> findAll(String sortColumn, boolean isAscending) { - return find(null, sortColumn, isAscending); + @Override + public List<E> findAll(Filter... filter) { + return find(null, null, null, filter); } - public List<E> findAll(int count, String sortColumn, boolean isAscending) { - return find(null, count, sortColumn, isAscending); + @Override + public List<E> findAll(Sort sort, Filter... filter) { + return find(null, sort, null, filter); } - public List<E> findAll(int count, int offset, String sortColumn, boolean isAscending) { - return find(null, count, offset, sortColumn, isAscending); - } - - protected CriteriaBuilder getCriteriaBuilder() { - return entityManager.getCriteriaBuilder(); + @Override + public List<E> findAll(Pagination pagination, Filter... filter) { + return find(null, null, pagination, filter); } - protected CriteriaQuery<E> createQuery() { - CriteriaQuery<E> c = getCriteriaBuilder().createQuery(this.entity); - return c; + @Override + public List<E> findAll(Sort sort, Pagination pagination, Filter... filter) { + return find(null, sort, pagination, filter); } - protected List<E> find(CriteriaQuery<E> query) { - return find(query, 0, 0, null, true); - } - - protected List<E> find(CriteriaQuery<E> query, int count) { - return find(query, count, 0, null, true); - } - - protected List<E> find(CriteriaQuery<E> query, int count, int offset) { - return find(query, count, offset, null, true); + return find(query, null, null); } - protected List<E> find(CriteriaQuery<E> query, String sortColumn) { - return find(query, sortColumn, true); + protected List<E> find(CriteriaQuery<E> query, Pagination pagination) { + return find(query, null, pagination); } - protected List<E> find(CriteriaQuery<E> query, int count, String sortColumn) { - return find(query, count, sortColumn, true); - } - - protected List<E> find(CriteriaQuery<E> query, int count, int offset, String sortColumn) { - return find(query, count, offset, sortColumn, true); - } - - - protected List<E> find(CriteriaQuery<E> query, String sortColumn, boolean isAscending) { - return find(query, 0, 0, sortColumn, isAscending); + protected List<E> find(CriteriaQuery<E> query, Sort sort) { + return find(query, sort, null); } - protected List<E> find(CriteriaQuery<E> query, int count, String sortColumn, boolean isAscending) { - return find(query, count, 0, sortColumn, isAscending); - } - - protected List<E> find(CriteriaQuery<E> query, int count, int offset, String sortColumn, boolean isAscending) { + protected List<E> find(CriteriaQuery<E> query, Sort sort, Pagination pagination, Filter... filter) { Root<E> root; // check if we have a 'simple' query @@ -157,20 +147,39 @@ public abstract class GenericJpaDao<E extends TypedEntity<K>, K> implements root = query.from(this.entity); query.select(root); - if (sortColumn != null) { - if (isAscending) { - query.orderBy(getCriteriaBuilder().asc(root.get(sortColumn))); + if (filter != null) { + Set<Predicate> predicates = new HashSet<Predicate>(); + for (final Filter f: filter) { + f.buildFilters(getCriteriaBuilder(), root); + for (Predicate p : f.getPredicates()) { + predicates.add(p); + } + } + if (predicates.size() > 0) { + query.where((Predicate[]) predicates.toArray()); + } + } + + + // Result Sorting + // TODO: Multcolum sort + if (sort != null) { + if (sort.isAsc()) { + query.orderBy(getCriteriaBuilder().asc(root.get(sort.getColumn()))); } else { - query.orderBy(getCriteriaBuilder().desc(root.get(sortColumn))); + query.orderBy(getCriteriaBuilder().desc(root.get(sort.getColumn()))); } } + // Result pagination TypedQuery<E> q = entityManager.createQuery(query); - if ( count > 0 ) { - q.setFirstResult(offset); - } - if (offset > 0) { - q.setMaxResults(count); + if (pagination != null) { + if ( pagination.getCount() > 0 ) { + q.setFirstResult(pagination.getCount()); + } + if ( pagination.getOffset() > 0) { + q.setMaxResults(pagination.getOffset()); + } } return q.getResultList(); @@ -201,4 +210,15 @@ public abstract class GenericJpaDao<E extends TypedEntity<K>, K> implements return find(query).get(0); } } + + + protected CriteriaBuilder getCriteriaBuilder() { + return entityManager.getCriteriaBuilder(); + } + + protected CriteriaQuery<E> createQuery() { + CriteriaQuery<E> c = getCriteriaBuilder().createQuery(this.entity); + return c; + } + } |