package blog.common;
import java.util.*;
import javax.ejb.*;
import javax.persistence.*;
@Stateless
public class Database
{
@PersistenceContext private EntityManager em;
public Long save(BaseEntity instance)
{
if (instance.getId() == null) {
em.persist(instance);
}
else {
instance = em.merge(instance);
em.flush();
}
return instance.getId();
}
public void remove(BaseEntity instance)
{
if (em.contains(instance)) {
em.remove(instance);
}
else {
BaseEntity persistentInstance = em.find(instance.getClass(), instance.getId());
if (persistentInstance != null) {
em.remove(persistentInstance);
}
}
}
public <E extends BaseEntity> E find(Class<E> entityClass, long id)
{
return em.find(entityClass, id);
}
public <S> S findSingle(String ql, Object... args)
{
Query query = createQuery(ql, args);
try {
@SuppressWarnings("unchecked") S result = (S) query.getSingleResult();
return result;
}
catch (NoResultException ignore) {
return null;
}
}
private Query createQuery(String ql, Object... args)
{
Query query = em.createQuery(ql);
for (int i = 0; i < args.length; i++) {
Object arg = args[i];
query.setParameter(1 + i, arg);
}
return query;
}
public <E extends BaseEntity> List<E> find(String ql, Object... args)
{
Query query = createQuery(ql, args);
@SuppressWarnings("unchecked") List<E> resultList = query.getResultList();
return resultList;
}
public <E extends BaseEntity> List<E> findWithPaging(String ql, int maxResults, int firstResult, Object... args)
{
Query query = createQuery(ql, args);
query.setMaxResults(maxResults).setFirstResult(firstResult);
@SuppressWarnings("unchecked") List<E> resultList = query.getResultList();
return resultList;
}
}