/*
* Copyright (c) 2015 Felix Husse under MIT License
* see LICENSE file
*/
package de.fatalix.bookery.bl;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
/**
*
* @author felix.husse
*/
public abstract class DAOBean <T extends EntityIntf> {
protected EntityManager entityManager;
protected Class<T> theClass;
public void init(EntityManager entityManager, Class<T> theClass) {
this.entityManager = entityManager;
this.theClass = theClass;
}
public T update(T entity) {
return entityManager.merge(entity);
}
public T save(T entity) {
entityManager.persist(entity);
return entity;
}
public void delete(Integer id) {
T entity = entityManager.getReference(theClass, id);
if(entity != null) {
entityManager.remove(entity);
}
}
public void deleteAll() {
List<T> objects = findAll();
if(objects != null) {
for(T object : objects) {
if(object != null && object.getId() != null) {
delete(object.getId());
}
}
}
}
public List<T> findAll() {
return entityManager.createQuery("SELECT p FROM " + theClass.getSimpleName()+" p",theClass).getResultList();
}
public T findById(Integer id) {
return entityManager.find(theClass, id);
}
public List<T> find(String namedQueryName) {
return entityManager.createNamedQuery(namedQueryName, theClass).getResultList();
}
// helper methods
/**
* This helper method is used, if an {@code Number} is expected as return value as for aggregate functions.
*
* @param parameter
* The query parameter.
* @param queryName
* @return In case, the result of the query is null, {@code null} is returned, otherwise the result.
*/
protected Number getNumber(Map<String, ?> parameter, String queryName) {
TypedQuery<Number> query = entityManager.createNamedQuery(queryName, Number.class);
for(Map.Entry<String, ?> entry : parameter.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
List<Number> queryResult = query.getResultList();
if(queryResult != null && queryResult.size() > 0) {
Number result = queryResult.get(0);
if(result == null) {
return 0;
} else {
return result;
}
} else {
return null;
}
}
/**
* This method is used, if a list is expected as return value.
*
* @param parameter
* The query parameter.
* @param queryName
* @return The query result.
*/
protected List<T> getList(Map<String, ?> parameter, String queryName) {
TypedQuery<T> query = entityManager.createNamedQuery(queryName, theClass);
for(Map.Entry<String, ?> entry : parameter.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
return query.getResultList();
}
protected List<T> getTopList(Map<String, ?> parameter, String queryName, int numberOfMaxFirst) {
TypedQuery<T> query = entityManager.createNamedQuery(queryName, theClass);
for(Map.Entry<String, ?> entry : parameter.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
query.setFirstResult(0);
query.setMaxResults(numberOfMaxFirst);
return query.getResultList();
}
/**
* Executes an update.
*
* @param parameter
* The query parameter.
* @param queryName
* @return The number of updated objects.
*/
protected int executeBatchUpdate(Map<String, ?> parameter, String queryName) {
Query query = entityManager.createNamedQuery(queryName);
for(Map.Entry<String, ?> entry : parameter.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
return query.executeUpdate();
}
/**
* Executes a batch delete.
*
* @param parameter
* The query parameter.
* @param queryName
* @return The number of deleted objects.
*/
protected int executeBatchDelete(Map<String, ?> parameter, String queryName) {
Query query = entityManager.createNamedQuery(queryName);
for(Map.Entry<String, ?> entry : parameter.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
return query.executeUpdate();
}
/**
* This method is used, if a single object is expected.
*
* @param parameter
* The query parameter.
* @param queryName
* @return In case, the query result is greater then 0, the first object is returned, otherwise {@code null}
*/
protected T getFirstEntity(Map<String, ?> parameter, String queryName) {
List<T> list = getTopList(parameter, queryName,1);
if(list != null && list.size() > 0) {
return list.get(0);
} else {
return null;
}
}
}