*
*/
@SuppressWarnings("unchecked")
@Override
public List<Object> getEntityList(Store store) {
Config config = store.getConfig();
List<Object> list = new ArrayList<Object>();
String persistenceUnitName = config.getPersistenceUnitName();
EntityManager em = persistenceUnitName == null ?
getEntityManager() : getEntityManager(persistenceUnitName);
Map<String,Object> parameters = new HashMap<String,Object>(config.getParams());
try {
Class<?> clazz = config.getClazz();
String className = clazz.getSimpleName();
String alias = className.toLowerCase().substring(0,1);
/*
* Core JPQL
*/
String jpql = "SELECT " + alias + " FROM " + className + " " + alias;
/*
* Where
*/
String where = "";
if (config.getWhere() != null) {
where += config.getWhere();
}
/*
* Filter
*/
for (Filter filter : config.getFilters()) {
if (!where.isEmpty()) where += " AND ";
String val = String.valueOf(filter.getValue());
String prop = filter.getProperty();
/*
* Handle between inclusive
*/
if (val.contains(">=<")) {
String[] filterParts = val.split(">=<");
where += "(" + alias + "." + filter.getProperty() + " BETWEEN :" +
prop + "_low AND :" + prop + "_high)" +
"";
parameters.put(prop + "_low", filterParts[0]);
parameters.put(prop + "_high", filterParts[1]);
/*
* Handle "OR"
*/
} else if (String.valueOf(filter.getValue()).contains("||")) {
String whereOr = "";
int i = 1;
for (String orPart : String.valueOf(filter.getValue()).split("\\|\\|")) {
whereOr += whereOr.isEmpty() ? "(" : " OR ";
whereOr += alias + "." + filter.getProperty() + " = :" + filter.getProperty() + i;
parameters.put(filter.getProperty() + i, orPart);
i++;
}
whereOr += ")";
where += whereOr;
} else {
String eqType = String.valueOf(filter.getValue()).contains("%") ? " like " : " = ";
if (eqType.contains("like")) {
where += "lower(" + alias + "." + filter.getProperty() + ")" + eqType + ":" + filter.getProperty();
} else {
where += alias + "." + filter.getProperty() + eqType + ":" + filter.getProperty();
}
parameters.put(filter.getProperty(), filter.getValue());
}
}
/*
* Add where clause
*/
if (!where.isEmpty()) jpql += " WHERE " + where;
if (config.getSorters().size() > 0) {
String sortClause = "";
for (Sorter sorter : config.getSorters()) {
if (!sortClause.isEmpty()) sortClause += ",";
sortClause += alias + "." + sorter.getProperty() + " " + sorter.getDirection();
}
jpql += " ORDER BY " + sortClause;
}
log.debug("JPQL: " + jpql);
Query q = em.createQuery(jpql, clazz);
/*
* Add params
* TODO: This is tedius... we want to automatically determine the
* type for the field we're trying to set the parameter for
*/
for (String key : parameters.keySet()) {
Object paramObj = parameters.get(key);
Class<?> paramType = q.getParameter(key).getParameterType();
String typeName = paramType.getSimpleName().toLowerCase();
try {
if (typeName.equals("boolean")) {
String stringVal = (String) paramObj;
paramObj = stringVal.equals("1") || stringVal.equals("true") || stringVal.equals("Y");
} else if (typeName.equals("date")) {
paramObj = dateFormat.parse((String) paramObj);
} else {
Method m = paramType.getDeclaredMethod("valueOf", String.class);
paramObj = m.invoke(null, paramObj);
}
} catch (Exception e) {}
log.debug(" Param: " + key + " = " + paramObj);
q.setParameter(key, paramObj);
}
store.setTotalCount(q.getResultList().size());
if (config.getPageSize() != null) q.setMaxResults(config.getPageSize());
if (config.getStart() != null) q.setFirstResult(config.getStart());
list = q.getResultList();
} catch (Exception e) {
log.warn("Error", e);
}