package cn.newgxu.jpamodel; import java.io.Serializable; import java.util.ArrayList; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.Query; import net.sf.querytool.DynamicQResult; import net.sf.querytool.FilterTag; import net.sf.querytool.provider.QueryTool; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import cn.newgxu.bbs.common.Pagination; /** * * @author wyx * @date 2007-3-23--02:58:16 */ @SuppressWarnings("serial") public abstract class JPAEntity implements Serializable { protected Log log = LogFactory.getLog(this.getClass()); public static final QueryTool QT = new QueryTool(new FilterTag("ignore", "<", ">", "</", ">")); public static final Query query(final DynamicQResult dqr) { EntityManager em = em(); Query q = em.createQuery(dqr.getQueryStr()); for (Object k : dqr.getParams().keySet()) { q.setParameter((String) k, dqr.getParams().get(k)); } return q; } public static List<?> getResultList(DynamicQResult dqr) { return query(dqr).getResultList(); } public static JPAEntity getById(Class<?> entityType, Object id) throws ObjectNotFoundException { JPAEntity entity = (JPAEntity) em().find(entityType, id); if (entity == null) { throw new ObjectNotFoundException(); } return entity; } // 添加了事务管理,否则在发消息时插入不了 public void save() { // em().getTransaction().begin(); em().persist(this); // em().getTransaction().commit(); } public void delete() { em().remove(this); } public void update() { em().merge(this); } public static Pair P(Object id, Object value) { return new Pair(id, value); } public final static Object SQ(Object... args) throws ObjectNotFoundException { try { return Q(args).getSingleResult(); } catch (Exception e) { e.printStackTrace(); throw new ObjectNotFoundException(); } } public final static Query Q(Object... args) { String qstr = null; List<Pair> params = new ArrayList<Pair>(); int first = 0; int size = Integer.MAX_VALUE; for (Object o : args) { if (o instanceof String) qstr = (String) o; if (o instanceof Pair) params.add((Pair) o); if (o instanceof Pair[]) { for (Pair p : (Pair[]) o) { params.add(p); } } if (o instanceof List) { for (Object p : (List<?>) o) { params.add((Pair) p); } } if (o instanceof Pagination) { Pagination p = (Pagination) o; first = p.getFirst(); size = p.getPageSize(); } } Query q = _q(qstr, params); q.setFirstResult(first); q.setMaxResults(size); System.out.println(qstr+" "+first+" "+size); return q; } final static EntityManager em() { return ModelContext.getEntityManager(); } static Query _q(String qstr, List<Pair> params) { // System.out.println(em()); Query q = em().createQuery(qstr); for (Pair p : params) { if (p.id instanceof String) { q.setParameter((String) p.id, p.value); } else q.setParameter(Integer.parseInt(p.id.toString()), p.value); } return q; } public static class Pair { Object id; Object value; public Pair(Object id, Object value) { super(); this.id = id; this.value = value; } public String toString() { return "" + id + "=>" + value; } } /** * 使用MySQL方言去获取数据,有时是很方便的。 * @param sql * @since 2012-05-10 * @author ivy * @return */ // public static Object createNativeSQL(String sql) { // return em().createNativeQuery(sql).getSingleResult(); // } /** * 获取entityManager,自己去控制实体的数据层。 * @return EntityManager * @author longkai * @since 2012-09-20 */ protected static EntityManager getEntityManager() { EntityManager entityManager = em(); if (entityManager == null) return ModelContext.getEntityManager(); return entityManager; } /** * 通过传入的实体名获取实体的总记录数。 * @param entityName * @return 记录数 * @author longkai * @since 2012-09-20 */ /*protected static int size(String entityName) { StringBuilder sb = new StringBuilder(); String alias = entityName.substring(0, 1).toLowerCase(); sb.append("select count(").append(alias) .append(".id) ").append("from ").append(entityName) .append(" ").append(alias); Long size = em().createQuery(sb.toString(), Long.class) .setFirstResult(0).setMaxResults(1).getSingleResult(); return size.intValue(); }*/ }