package org.fluxtream.core.utils;
import java.lang.reflect.Field;
import java.util.List;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.ManyToMany;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Query;
import org.fluxtream.core.domain.AbstractFacet;
public class JPAUtils {
public static String getEntityName(Class<? extends AbstractFacet> facetClass) {
try {
final Entity annotation = facetClass.getAnnotation(Entity.class);
final String name = annotation.name();
return name;
} catch (Throwable t) {
final String message = "Could not get Facet class for connector for " + facetClass.getName();
throw new RuntimeException(message);
}
}
public static boolean hasRelation(final Class<? extends AbstractFacet> facetClass) {
final Field[] fields = facetClass.getFields();
for (Field field : fields) {
if (field.getAnnotation(OneToMany.class)!=null||
field.getAnnotation(ManyToMany.class)!=null||
field.getAnnotation(OneToOne.class)!=null||
field.getAnnotation(ElementCollection.class)!=null)
return true;
}
return false;
}
public static long count(EntityManager em,
String queryName, Object... params) {
Query query = em.createNamedQuery(queryName);
int i = 1;
if (params != null)
for (Object param : params) {
query.setParameter(i++, param);
}
Number n = (Number) query.getSingleResult();
if (n!=null)
return n.longValue();
else
return -1;
}
public static <T> T findUnique(EntityManager em, Class<T> clazz,
String queryName, Object... params) {
List<T> results = doQuery(em, queryName, true, 0, 1, params);
if (results != null && results.size() > 0)
return results.get(0);
else
return null;
}
private static <T> List<T> doQuery(EntityManager em, String queryName,
boolean page, int firstResult, int maxResults, Object... params) {
Query query = em.createNamedQuery(queryName);
if (page) {
query.setFirstResult(firstResult);
query.setMaxResults(maxResults);
}
int i = 1;
if (params != null)
for (Object param : params) {
query.setParameter(i++, param);
}
try {
@SuppressWarnings("unchecked")
List<T> results = query.getResultList();
return results;
} catch (Throwable t) {
t.printStackTrace();
}
return null;
}
public static int execute(EntityManager em, String queryName,
Object... params) {
Query query = em.createNamedQuery(queryName);
int i = 1;
if (params != null) {
for (Object param : params) {
query.setParameter(i++, param);
}
}
int rowsAffected = query.executeUpdate();
return rowsAffected;
}
public static <T> List<T> find(EntityManager em, Class<T> clazz,
String queryName, Object... params) {
List<T> results = doQuery(em, queryName, false, -1, -1, params);
return results;
}
public static <T> List<T> findWithLimit(EntityManager em, Class<T> clazz, String queryName, int firstResult, int maxResults, Object... params) {
List<T> results = doQuery(em, queryName, true, firstResult,
maxResults, params);
return results;
}
public static <T> List<T> findPaged(final EntityManager em, final Class<T> clazz,
final String queryName, final int pageSize, final int page,
Object... params) {
List<T> results = doQuery(em, queryName, true, pageSize*page,
pageSize, params);
return results;
}
public static String asListOfString(final String...strings) {
StringBuilder sb = new StringBuilder();
for (int i=0; i<strings.length; i++) {
if (i>0) sb.append(",");
sb.append("'").append(strings[i]).append("'");
}
return sb.toString();
}
}