package com.breeze.jpa; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import com.breeze.metadata.IEntityType; import com.breeze.metadata.Metadata; import com.breeze.metadata.MetadataHelper; import com.breeze.query.EntityQuery; import com.breeze.query.QueryProcessor; import com.breeze.query.QueryResult; public class JPAQueryProcessor extends QueryProcessor { private EntityManagerFactory _emFactory; public JPAQueryProcessor(Metadata metadata, EntityManagerFactory emFactory) { super(metadata); _emFactory = emFactory; } @Override protected QueryResult executeQuery(IEntityType entityType, EntityQuery entityQuery) { entityQuery.validate(entityType); Class<?> clazz = MetadataHelper.lookupClass(entityType.getName()); EntityManager em = _emFactory.createEntityManager(); try { em.getTransaction().begin(); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<?> cq = cb.createQuery(clazz); JPACriteriaBuilder.create(cq, cb, entityType, entityQuery); // Root<?> pet = cq.from(clazz); // pet. // cq.select(pet); TypedQuery<?> q = em.createQuery(cq); Integer takeCount = entityQuery.getTakeCount(); if (takeCount != null && takeCount == 0) { // Hack because setMaxResults(0) returns all records instead of none. // so we do then equiv of skip 'everything' instead. // and then insure that we don't overwrite this with another skip. q.setFirstResult(Integer.MAX_VALUE); } else { if (takeCount != null) { q.setMaxResults(takeCount); } Integer skipCount = entityQuery.getSkipCount(); if (skipCount != null) { q.setFirstResult(skipCount); } } List<?> result = q.getResultList(); QueryResult qr; if (entityQuery.isInlineCountEnabled()) { // builder.applyInlineCount(crit); long countResult = 7; //(Long) crit.uniqueResult(); // log.debugv("query: inline count={0}", countResult); qr = new QueryResult(result, countResult); } else { qr = new QueryResult(result); } em.getTransaction().commit(); return qr; } catch (Exception ex) { em.getTransaction().rollback(); throw ex; } finally { em.clear(); em.close(); } } }