BaseHibernateDaoSupport.java

package com.tradecloud.repository.base.impl;

import org.hibernate.*;
import org.hibernate.criterion.DetachedCriteria;
import org.postgresql.util.PSQLException;

import javax.annotation.Resource;
import java.util.List;

public class BaseHibernateDaoSupport extends org.springframework.orm.hibernate5.support.HibernateDaoSupport {

    @Resource(name = "sessionFactory")
    public void setSuperSessionFactory(SessionFactory sessionFactory) {
        super.setSessionFactory(sessionFactory);
    }

    public final Session getHTemplate() {
        return getCurrentSession();
    }

    public Session getSessionCustom() {
        return getCurrentSession();
    }

    public Session getCurrentSession() {
        try {
            return super.getSessionFactory().getCurrentSession();
        } catch (SessionException e) {
            logger.debug("Error getting session, attempt opening session");
            return super.getSessionFactory().openSession();
        }
    }

    public Session getCurrentSessionNoMulti() {
        return super.getSessionFactory().getCurrentSession();
    }

    public Session getSession() {
        return getCurrentSession();
    }

    public List<?> getNamedQueryAndNamedParam(String queryName, String paramName, Object parm) {
        Query query = getCurrentSession().getNamedQuery(queryName);
        query.setParameter(paramName, parm);
        return (List<?>) query.list();
    }

    public List<?> getNamedQueryAndNamedParamList(String queryName, String paramName, List<?> parmList) {
        Query query = getCurrentSession().getNamedQuery(queryName);
        query.setParameterList(paramName, parmList);
        return (List<?>) query.list();
    }

    public List<?> getNamedQueryAndNamedParam(String queryName, String[] paramName, Object[] paramValue) {
        Query query = getCurrentSession().getNamedQuery(queryName);
        for (int i = 0; i < paramName.length; i++) {
            query.setParameter(paramName[i], paramValue[i]);
        }
        return (List<?>) query.list();
    }

    public List<?> findByNamedQuery(String queryName) {
        return (List<?>) getCurrentSession().getNamedQuery(queryName).list();
    }

    public List<?> findByNamedParam(String query, String paramName, Object paramValue) {
        return (List<?>) getCurrentSession().createQuery(query).setParameter(paramName, paramValue).list();
    }

    public List<?> findByNamedParam(String query, String[] paramName, Object[] paramValue) {
        Query query1 = getCurrentSession().createQuery(query);
        for (int i = 0; i < paramName.length; i++) {
            query1.setParameter(paramName[i], paramValue[i]);
        }
        return query1.list();
    }

    public List<?> findByCriteria(DetachedCriteria detachedCriteria) {
        return (List<?>) detachedCriteria.getExecutableCriteria(getCurrentSession()).list();
    }

    public List<?> getNamedQuery(String queryName) {
        return (List<?>) getCurrentSession().getNamedQuery(queryName).list();
    }

    public List<?> getNamedQuery(String queryName, Integer limit) {
        Query query = getCurrentSession().getNamedQuery(queryName);
        if (limit != null && limit > 0) {
            query.setMaxResults(limit);
        }
        return (List<?>) query.list();
    }

    public List<?> getNamedQuery(String queryName, Object... params) {
        Query query = getCurrentSession().getNamedQuery(queryName);
        for (int i = 0; i < params.length; i++) {
            query.setParameter(i, params[i]);
        }

        return (List<?>) query.list();
    }

    public List<?> loadAll(Class className) {
        Query query = getCurrentSession().createQuery("from " + className.getSimpleName());
        query.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
        return (List<?>) query.list();
    }

    public List<?> find(String sql) {
        return (List<?>) getCurrentSession().createQuery(sql).list();
    }

    public void deleteAll(List<?> toDelete) {
        for (Object o : toDelete)
            try {
                getCurrentSession().delete(o);
            } catch (Exception e) {
                handleDeleteConstraint(e.getClass().getSimpleName(), e);
                throw e;
            }
    }

    protected void handleDeleteConstraint(String name, Exception e) {
        Throwable cause = e;
        while (cause != null) {
            if (cause instanceof PSQLException) {
                PSQLException pgEx = (PSQLException) cause;
                if ("23503".equals(pgEx.getSQLState())) {
                    throw new IllegalStateException(String.format(
                            "Cannot delete [%s] since it is in use by [%s]",
                            name,
                            pgEx.getServerErrorMessage() != null ? pgEx.getServerErrorMessage().getTable() : "unknown"
                    ));
                }
            }
            cause = cause.getCause();
        }
    }

}