package org.sothis.dal.sql; import java.io.Serializable; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import org.sothis.core.util.Pager; import org.sothis.dal.AbstractJpaCompatibleDao; import org.sothis.dal.query.Chain; import org.sothis.dal.query.Cnd; public abstract class AbstractSqlDao<E extends SqlEntity, K extends Serializable> extends AbstractJpaCompatibleDao<E, K> implements SqlDao<E, K> { protected abstract EntityManager getEntityManager(); @SuppressWarnings("unchecked") @Override public List<E> find(Cnd cnd, Pager pager, Chain chain) { Query query = SqlQueryBuilder.select(entityClass, cnd, chain, getEntityManager()); if (null != pager) { query.setFirstResult(pager.getStartRow()); query.setMaxResults(pager.getPageSize()); } else { query.setFirstResult(0); query.setMaxResults(Integer.MAX_VALUE); } return query.getResultList(); } @Override public E findById(K id) { return this.getEntityManager().find(entityClass, id); } @Override public int update(Cnd cnd, Chain chain) { Query query = SqlQueryBuilder.update(entityClass, cnd, chain, getEntityManager()); return query.executeUpdate(); } @Override public E update(E entity) { return this.getEntityManager().merge(entity); } @Override public int delete(Cnd cnd) { Query query = SqlQueryBuilder.delete(entityClass, cnd, getEntityManager()); return query.executeUpdate(); } @Override public E insert(E entity) { this.getEntityManager().persist(entity); return entity; } @Override public List<E> insert(List<E> entityList) { for (E e : entityList) { this.getEntityManager().persist(e); } return entityList; } @Override public int count(Cnd cnd) { Query query = SqlQueryBuilder.count(entityClass, cnd, getEntityManager()); Object result = query.getSingleResult(); int ret = 0; if (result != null) { ret = Integer.parseInt(result.toString()); } return ret; } }