/**
*
*/
package org.activejpa.entity;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaDelete;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Join;
import javax.persistence.criteria.Root;
import org.activejpa.jpa.JPA;
/**
* @author ganeshs
*
*/
class BaseObject {
protected static <T> TypedQuery<T> createQuery(CriteriaQuery<T> cQuery, Filter filter) {
TypedQuery<T> query = getEntityManager().createQuery(cQuery);
updateQueryParams(query, filter);
return query;
}
protected static <T> Query createQuery(CriteriaDelete<T> cQuery, Filter filter) {
Query query = getEntityManager().createQuery(cQuery);
updateQueryParams(query, filter);
return query;
}
private static void updateQueryParams(Query query, Filter filter) {
filter.setParameters(query);
filter.setPage(query);
query.setHint(JPA.instance.getCacheableHint(), filter.isCacheable());
}
@SuppressWarnings({ "rawtypes", "unchecked" })
protected static <T extends Model, S extends Model> TypedQuery<S> createQuery(Class<T> entityType, String attribute, Class<S> attributeType, Filter filter) {
CriteriaBuilder builder = getEntityManager().getCriteriaBuilder();
CriteriaQuery<S> cQuery = builder.createQuery(attributeType);
Root<T> root = cQuery.from(entityType);
if (attribute != null) {
Join join = root.join(attribute);
cQuery.select(join);
}
filter.constructQuery(builder, cQuery, root);
return createQuery(cQuery, filter);
}
protected static <T extends Model> TypedQuery<T> createQuery(Class<T> clazz, Filter filter) {
return createQuery(clazz, null, clazz, filter);
}
protected static <T extends Model> TypedQuery<T> createQuery(Class<T> clazz, Object... paramValues) {
return createQuery(clazz, createFilter(paramValues));
}
protected static Filter createFilter(Object... paramValues) {
Filter filter = new Filter();
if (paramValues != null) {
for (int i = 0; i < paramValues.length; i += 2) {
filter.addCondition(paramValues[i].toString(), paramValues[i + 1]);
}
}
return filter;
}
protected static EntityManager getEntityManager() {
return JPA.instance.getDefaultConfig().getContext().getEntityManager();
}
}