/**
*
*/
package com.btkjgc.utils;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.engine.spi.SessionFactoryImplementor;
import org.hibernate.exception.ConstraintViolationException;
import org.hibernate.jdbc.Work;
import org.hibernate.transform.Transformers;
import org.springframework.context.ApplicationContext;
/**
* @author lzh
* http://blog.csdn.net/loveyout/article/details/4193894
*/
final public class HibernateUtil
{
private static SessionFactory sessionFactory = null;
private static int BATCH_MAX_ROW=20;
private HibernateUtil()
{
}
public static void setSessionFactory(SessionFactory factory)
{
sessionFactory = factory;
}
public static SessionFactory getSessionFactory()
{
if(sessionFactory==null){
ApplicationContext ac = ApplicationContextUtil.getApplicationContext();
sessionFactory = (SessionFactory) ac.getBean("sessionFactory");
}
return sessionFactory;
}
public static Session openSession()
{
return getSessionFactory().openSession();
}
@SuppressWarnings("rawtypes")
public static Object getObjectById(Class clazz, java.io.Serializable id)
{
Session session = null;
Object object = null;
try
{
session = openSession();
object = session.get(clazz, id);
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
return object;
}
public static
int batchSave(final T[] objs) {
Session session = openSession();
Transaction tx = session.beginTransaction();
try {
for (int i = 0; i < objs.length; i++) {
session.save(objs[i]);
if (i % BATCH_MAX_ROW == 0) {
session.flush();
session.clear();
}
}
} catch (Exception e) {
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
session.flush();
session.clear();
tx.commit();
return objs.length;
}
public static void save(Object obj)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
ss.save(obj);
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
public static void update(Object obj)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
ss.update(obj);
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
public static int batchUpdate(final T[] objs) {
Session session = openSession();
Transaction tx = session.beginTransaction();
try {
for (int i = 0; i < objs.length; i++) {
session.update(objs[i]);
if (i % BATCH_MAX_ROW == 0) {
session.flush();
session.clear();
}
}
} catch (Exception e) {
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
} finally {
if (session != null && session.isOpen()) {
session.close();
}
}
session.flush();
session.clear();
tx.commit();
return objs.length;
}
public static void updateIfExists(Object obj)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
ss.update(obj);
tx.commit();
}
catch (Exception e)
{
if (tx != null)
{
tx.rollback();
}
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
public static void delete(Object obj)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
ss.delete(obj);
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
public static void saveOrUpdate(Object obj)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
ss.saveOrUpdate(obj);
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
@SuppressWarnings("rawtypes")
public static List executeQueryList(String hql, Object... parameters)
{
Session session = null;
List list = null;
try
{
session = openSession();
Query query = session.createQuery(hql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i].toString());
}
}
list = query.list();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
return list;
}
@SuppressWarnings("rawtypes")
public static List executeQueryList(String hql,Class clazz,Object... parameters)
{
Session session = null;
List list = null;
try
{
session = openSession();
Query query = session.createQuery(hql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, String.valueOf(parameters[i]));
}
}
list =query.setResultTransformer(Transformers.aliasToBean(clazz)).list();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
return list;
}
public static int executeQueryCount(String hql,Object... parameters)
{
Session session = null;
try
{
session = openSession();
Query query = session.createQuery(hql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i].toString());
}
}
return ((Number) (query.uniqueResult())).intValue();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
}
@SuppressWarnings("rawtypes")
public static List executeQueryFinalNRecords(String hql,
String[] parameters, Integer record_length)
{
Session session = null;
List list = null;
try
{
session = openSession();
Query query = session.createQuery(hql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i]);
}
}
query.setMaxResults(record_length);
list = query.list();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
return list;
}
public static void batchExecuteUpdate(List hqlList)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
for (int i = 0; i < hqlList.size(); i++) {
Query query = ss.createQuery(hqlList.get(i));
query.executeUpdate();
}
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
public static void batchExecuteUpdate(List hqlList,List> paramLists)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
for (int i = 0; i < hqlList.size(); i++) {
Query query = ss.createQuery(hqlList.get(i));
List paramLists2= paramLists.get(i);
for (int j = 0; j query.setString(j,paramLists2.get(j));
}
query.executeUpdate();
}
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
public static void executeUpdate(String hql, String... parameters)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
Query query = ss.createQuery(hql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i]);
}
}
query.executeUpdate();
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
public static void batchExecuteSQLUpdate(ListsqlList)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
for (int i = 0; i < sqlList.size(); i++) {
Query query = ss.createSQLQuery(sqlList.get(i));
query.executeUpdate();
}
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
public static void executeSQLUpdate(String sql, Object... parameters)
{
Session ss = null;
Transaction tx = null;
try
{
ss = openSession();
tx = ss.beginTransaction();
Query query = ss.createSQLQuery(sql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
if (parameters[i] != null)
{
query.setString(i, parameters[i].toString());
}
else
{
query.setString(i, null);
}
}
}
query.executeUpdate();
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
}
public static int executeUpdateIfExist(String hql, String[] parameters)
{
Session ss = null;
Transaction tx = null;
int updateNumbers = 0;
try
{
ss = openSession();
tx = ss.beginTransaction();
Query query = ss.createQuery(hql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i]);
}
}
updateNumbers = query.executeUpdate();
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
if (tx != null)
{
tx.rollback();
}
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
return updateNumbers;
}
public static Object executeQueryOneObject(String hql, String...parameters)
{
Session ss = null;
Object obj = null;
try
{
ss = openSession();
Query query = ss.createQuery(hql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i]);
}
}
obj = query.uniqueResult();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (ss != null && ss.isOpen())
{
ss.close();
}
}
return obj;
}
@SuppressWarnings({ "unused", "rawtypes" })
public List findColumnByPage(String hql, String parameters[])
{
// Creat by Rong on 2015-8-8
Session session = null;
List list = null;
try
{
session = HibernateUtil.openSession();
Query query = session.createQuery(hql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i]);
}
}
query.setFirstResult(0);
query.setMaxResults(1);
return query.list();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
}
@SuppressWarnings("rawtypes")
public static List executeQueryList(String hql, int pageIndex, int pageSize,
String[] parameters)
{
Session session = null;
List list = null;
try
{
session = openSession();
Query query = session.createQuery(hql);
query.setFirstResult(pageIndex * pageSize);
query.setMaxResults(pageSize);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i]);
}
}
list = query.list();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
return list;
}
public static Integer executeSQLUpdate(String sql)
{
// 直接执行sql,直接执行在数据库可以执行的sql(相当于不使用映射文件)
// Creat by Rong on 2015-9-1
Session session = null;
try
{
session = HibernateUtil.openSession();
Query query = session.createSQLQuery(sql);
return query.executeUpdate();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
}
@SuppressWarnings("rawtypes")
public static List executeSQLQueryList(String sql)
{
// 直接执行sql,直接执行在数据库可以执行的sql(相当于不使用映射文件)
// Creat by Rong on 2015-6-27
Session session = null;
List list = null;
try
{
session = HibernateUtil.openSession();
Query query = session.createSQLQuery(sql);
/*
* if (parameters != null && parameters.length > 0) { for (int i =
* 0; i < parameters.length; i++) { query.setString(i,
* parameters[i]); } }
*/
list =query.list();
return list;
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
}
@SuppressWarnings("rawtypes")
public static List executeSQLQueryList(String sql, Class clazz,Object... parameters)
{
Session session = null;
List list = null;
try
{
session = openSession();
SQLQuery query = session.createSQLQuery(sql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i].toString());
}
}
list =query.setResultTransformer(Transformers.aliasToBean(clazz)).list();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
return list;
}
@SuppressWarnings("rawtypes")
public static Object executeSQLQueryObject(String sql, Class clazz,Object... parameters)
{
Session session = null;
List list = null;
Object object= null;
try
{
session = openSession();
SQLQuery query = session.createSQLQuery(sql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i].toString());
}
}
list =query.setResultTransformer(Transformers.aliasToBean(clazz)).list();
if(list!=null && list.size()!=0){
object=list.get(0);
}
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
return object;
}
@SuppressWarnings("rawtypes")
public static Object executeSQLQueryObject(String sql,Object... parameters)
{
Session session = null;
List list = null;
Object object= null;
try
{
session = openSession();
SQLQuery query = session.createSQLQuery(sql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i].toString());
}
}
list =query.list();
if(list!=null && list.size()!=0){
object=list.get(0);
}
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
return object;
}
public static int executeSQLQueryInt(String sql, Object... parameters)
{
Session session = null;
try
{
session = openSession();
Query query = session.createSQLQuery(sql);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i].toString());
}
}
return ((Number) (query.uniqueResult())).intValue();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
}
@SuppressWarnings("rawtypes")
public static List executeSQLQueryList(String sql, int pageIndex, int pageSize,
String[] parameters,Class clazz)
{
Session session = null;
List list = null;
try
{
session = openSession();
Query query = session.createSQLQuery(sql);
query.setFirstResult(pageIndex * pageSize);
query.setMaxResults(pageSize);
if (parameters != null && parameters.length > 0)
{
for (int i = 0; i < parameters.length; i++)
{
query.setString(i, parameters[i]);
}
}
list =query.setResultTransformer(Transformers.aliasToBean(clazz)).list();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
return list;
}
public static void callProcedure(final String procedure,final Object... objs){
Session session = null;
try
{
session = openSession();
Transaction tx = session.beginTransaction();
session.doWork(new Work() {
public void execute(Connection connection) {
// 这里已经得到connection了,可以继续你的JDBC代码。
// 注意不要close了这个connection。
CallableStatement cstmt;
try {
cstmt = connection.prepareCall(procedure);
for (int i = 0; i < objs.length; i++) {
cstmt.setObject(i, objs[i]);
}
cstmt.executeUpdate();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
tx.commit();
}
catch (Exception e)
{
e.printStackTrace();
throw new RuntimeException(e.getMessage());
}
finally
{
if (session != null && session.isOpen())
{
session.close();
}
}
}
}