package fi.arcusys.koku.common.service.impl;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import javax.persistence.EntityManager;
import javax.persistence.NonUniqueResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import fi.arcusys.koku.common.service.AbstractEntityDAO;
import fi.arcusys.koku.common.service.datamodel.AbstractEntity;
/**
* Abstract implementation for all data model related DAO implementations.
*
* @author Dmitry Kudinov (dmitry.kudinov@arcusys.fi)
* May 18, 2011
*/
public abstract class AbstractEntityDAOImpl<T extends AbstractEntity> implements AbstractEntityDAO<T> {
public static final String IDS_PARAMETER_NAME = "ids";
protected EntityManager em;
private Class<T> clazz;
/**
*
*/
protected AbstractEntityDAOImpl(final Class<T> clazz) {
this.clazz = clazz;
}
@PersistenceContext
public void setEntityManager(final EntityManager em) {
this.em = em;
}
/**
* @param entity
* @return
*/
public T create(final T entity) {
em.persist(entity);
return entity;
}
protected T getSingleResultOrNull(final String queryName, final Map<String, ?> params) {
final Query query = em.createNamedQuery(queryName);
for (final Map.Entry<String, ?> entry : params.entrySet()) {
query.setParameter(entry.getKey(), entry.getValue());
}
final List<T> result = (List<T>)query.getResultList();
if (result.size() == 0) {
return null;
} else if (result.size() == 1) {
return result.get(0);
} else {
throw new NonUniqueResultException("Multiple results found. Query: " + queryName + ", params: " + params);
}
}
/**
* @param entityId
* @return
*/
public T getById(final Long entityId) {
return em.find(this.clazz, entityId);
}
/**
* @param ids
* @return
*/
@Override
public List<T> getListByIds(final List<Long> ids) {
if (ids == null || ids.isEmpty()) {
return Collections.emptyList();
}
return getResultList(getListByIdsQueryName(), Collections.<String, Object>singletonMap(IDS_PARAMETER_NAME, ids));
}
protected String getListByIdsQueryName() {
throw new UnsupportedOperationException("This method should be overrided in subclass.");
}
/**
* @param entity
*/
public void delete(final T entity) {
em.remove(em.merge(entity));
}
@Override
public int deleteAll(List<Long> messageRefs) {
final Query query = em.createNamedQuery(getDeleteByIdsQueryName());
query.setParameter(IDS_PARAMETER_NAME, messageRefs);
return query.executeUpdate();
}
protected String getDeleteByIdsQueryName() {
throw new UnsupportedOperationException("This method should be overrided in subclass.");
}
public T update(final T entity) {
return em.merge(entity);
}
protected <E> List<E> getResultList(final String queryName, final Map<String, ? extends Object> params) {
return getResultList(queryName, params, FIRST_RESULT_NUMBER, MAX_RESULTS_COUNT);
}
protected <E> List<E> getResultList(final String queryName, final Map<String, ?> params, final int firstResult, final int maxResults) {
final Query query = em.createNamedQuery(queryName);
for (final Map.Entry<String, ?> param : params.entrySet()) {
query.setParameter(param.getKey(), param.getValue());
}
query.setFirstResult(firstResult - 1);
query.setMaxResults(maxResults);
return (List<E>)query.getResultList();
}
protected <E> List<E> executeQuery(final String queryString, final Map<String, ?> params, final int firstResult, final int maxResults) {
final Query query = em.createQuery(queryString);
for (final Map.Entry<String, ?> param : params.entrySet()) {
query.setParameter(param.getKey(), param.getValue());
}
query.setFirstResult(firstResult - 1);
query.setMaxResults(maxResults);
return (List<E>)query.getResultList();
}
protected <E> E executeQueryWithSingleResult(final String queryString, final Map<String, ?> params) {
final Query query = em.createQuery(queryString);
for (final Map.Entry<String, ?> param : params.entrySet()) {
query.setParameter(param.getKey(), param.getValue());
}
return (E)query.getSingleResult();
}
protected <E> E getSingleResult(final String queryName, final Map<String, ?> params) {
final Query query = em.createNamedQuery(queryName);
for (final Map.Entry<String, ?> param : params.entrySet()) {
query.setParameter(param.getKey(), param.getValue());
}
return (E)query.getSingleResult();
}
protected String getPrefixLike(String searchString) {
if (searchString == null) {
return "%";
} else {
return searchString + "%";
}
}
protected String getPrefixAndSuffixLike(final String searchString) {
if (searchString == null) {
return "%";
} else {
return "%" + searchString + "%";
}
}
/**
* @param string
* @param singletonMap
*/
protected int executeBulkOperation(String string, Map<String, ?> params) {
final Query query = em.createNamedQuery(string);
for (final Map.Entry<String, ?> param : params.entrySet()) {
query.setParameter(param.getKey(), param.getValue());
}
return query.executeUpdate();
}
}