package org.joget.commons.spring.model;
import java.io.Serializable;
import java.text.Normalizer;
import java.util.Collection;
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Example;
public abstract class AbstractSpringDao extends HibernateDaoSupport {
public AbstractSpringDao() {
}
public Session findSession() {
Session session;
SessionFactory sf = super.getSessionFactory();
session = sf.getCurrentSession();
return session;
}
protected Serializable save(String entityName, Object obj) {
Session session = findSession();
Serializable save = session.save(entityName, obj);
session.flush();
return save;
}
protected void saveOrUpdate(String entityName, Object obj) {
Session session = findSession();
session.saveOrUpdate(entityName, obj);
session.flush();
}
protected void merge(String entityName, Object obj) {
Session session = findSession();
session.merge(entityName, obj);
session.flush();
}
protected void delete(String entityName, Object obj) {
Session session = findSession();
session.delete(entityName, obj);
session.flush();
}
protected Object find(String entityName, String id) {
Session session = findSession();
return session.get(entityName, id);
}
protected List findByExample(String entityName, Object object) {
Session session = findSession();
Criteria crit = session.createCriteria(object.getClass());
Example example = Example.create(object);
crit.add(example);
return crit.list();
}
protected Collection find(final String entityName, final String condition, final Object[] params, final String sort, final Boolean desc, final Integer start, final Integer rows) {
Session session = findSession();
String query = "SELECT e FROM " + entityName + " e " + condition;
if (sort != null && !sort.equals("")) {
String filteredSort = filterSpace(sort);
query += " ORDER BY " + filteredSort;
if (desc) {
query += " DESC";
}
}
Query q = session.createQuery(query);
int s = (start == null) ? 0 : start;
q.setFirstResult(s);
if (rows != null && rows > 0) {
q.setMaxResults(rows);
}
if (params != null) {
int i = 0;
for (Object param : params) {
q.setParameter(i, param);
i++;
}
}
return q.list();
}
protected Long count(final String entityName, final String condition, final Object[] params) {
Session session = findSession();
Query q = session.createQuery("SELECT COUNT(*) FROM " + entityName + " e " + condition);
if (params != null) {
int i = 0;
for (Object param : params) {
q.setParameter(i, param);
i++;
}
}
return ((Long) q.iterate().next());
}
/**
* Normalizes and truncates a String if there is a space.
* @param str
* @return
*/
protected String filterSpace(String str) {
if (str != null) {
str = Normalizer.normalize(str, Normalizer.Form.NFKC);
if (str.contains(" ")) {
str = str.substring(0, str.indexOf(" "));
}
}
return str;
}
}