package com.kingschan.blog.dao;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.metadata.ClassMetadata;
import org.hibernate.search.FullTextQuery;
import org.hibernate.search.FullTextSession;
import org.hibernate.search.Search;
import org.hibernate.search.query.dsl.QueryBuilder;
import org.hibernate.transform.Transformers;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
/**
*
*
* 类名称:BaseDao
* 类描述:
* 创建人:陈国祥 (kingschan)
* 创建时间:2015-5-19 下午4:23:28
* 修改人:Administrator
* 修改时间:2015-5-19 下午4:23:28
* 修改备注:
* @version V1.0
*
*/
@Repository("HibernateBaseDao")
@SuppressWarnings("unchecked")
public class HibernateBaseDao {
public Logger log = LoggerFactory.getLogger(HibernateBaseDao.class);
private static int BATCH_SIZE=50;
@Autowired
private SessionFactory sessionfactory;
public SessionFactory getSessionfactory() {
return sessionfactory;
}
public void setSessionfactory(SessionFactory sessionfactory) {
Map<String, ClassMetadata> map = sessionfactory.getAllClassMetadata();
Iterator<String> keys = map.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
ClassMetadata cmd =map.get(key);
System.out.println(String.format("主键字段%s,主键类型%s", cmd.getIdentifierPropertyName(),
cmd.getIdentifierType().getName()
));
System.out.println(cmd.getMappedClass().getSimpleName());// 对到映射的类
// System.out.println(cmd.getEntityName());//对应实体完整类名
// System.out.println(cmd.toString());
}
this.sessionfactory = sessionfactory;
log.info("注入sessionfactory");
}
public Session getSession() {
Session session = null;
try
{
session = sessionfactory.getCurrentSession();
// log.info("只有在事务管理下,才能通过 getCurrentSession() 得到 session ,如果显示这个信息,则说明事务管理工作起作用了。");
}
catch(HibernateException ex)
{
session = sessionfactory.openSession();
log.info("*************************************************************");
log.info("* *");
log.error("* 通过 openSession() 得到。事务管理没有起作用,需要检查配置。 *"+ex);
log.info("* *");
log.info("*************************************************************");
}
return session;
}
/**
* 得到全文检索会话对象
* @return
*/
public FullTextSession getFullTextSession(){
return Search.getFullTextSession(getSession());
}
/**
* hibernate search 全文检索分页查询
* @param keyword 关键字
* @param clazz 类型
* @param pageindex 页码
* @param limit 显示条数
* @param cacheable 是否缓存
* @param fields 字段名
* @return
*/
public Pagination Paginations(String keyword, Class<?> clazz, int pageindex, int limit, boolean cacheable, String...fields) {
Pagination page = new Pagination();
List<?> lis =null;
QueryBuilder qb = getFullTextSession().getSearchFactory()
.buildQueryBuilder().forEntity(clazz).get();
org.apache.lucene.search.Query query = qb
.keyword().onFields(fields).matching(keyword)
.createQuery();
// wrap Lucene query in a org.hibernate.Query
FullTextQuery fullTextQuery = getFullTextSession().createFullTextQuery(query, clazz);
fullTextQuery.setCacheable(cacheable);
fullTextQuery.setFirstResult((pageindex-1)*limit);
fullTextQuery.setMaxResults(limit);
lis =fullTextQuery.list();
//builder Pagination 对象
page.setData(lis);
page.setLimit(limit);
page.setPageindex(pageindex);
Integer total=fullTextQuery.getResultSize();
page.setTotal(total);
page.setMaxPage((total-1)/limit+1);
return page;
}
/**
* 保存一个对象
* @param obj
*/
public void save(Object obj) {
Session s = getSession();
s.save(obj);
}
/**
* 保存多个对象
* @param lis
*/
public void saveList(List<?> lis){
Session session = getSession();
session.saveOrUpdate(lis);
/*for(int a=0;a<lis.size();a++){
session.save(lis.get(a));
if (a % BATCH_SIZE == 0) {
session.flush();
session.clear();
}
}*/
}
/**
* 根据hql返回一个list 如果有参数刚hql用?来表示条件
* @param hql
* @param cacheable 是否开启缓存
* @param mapformat 是否把结果格式化成list[map]
* @param args 从1开始
* @return
*/
public List<?> queryForListByHql(String hql,boolean cacheable,boolean mapformat,Object...args) {
List<?> lis =null;
Query q =createHqlQuery(hql, args);
q.setCacheable(cacheable);
if (mapformat) {
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
}
lis = q.list();
return lis;
}
/**
* 根据hql返回一个list 如果有参数刚hql用?来表示条件
* @param hql
* @param cacheable 是否开启缓存
* @param mapformat 是否把结果格式化成list[map]
* @param map 参数
* @return
*/
public List<?> queryForListByHqlMapStyle(String hql,boolean cacheable,boolean mapformat,Map<String,Object> map) {
List<?> lis =null;
Query q =createHqlQuery(hql, map);
q.setCacheable(cacheable);
if (mapformat) {
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
}
lis = q.list();
return lis;
}
/**
* sql查询
* @param sql
* @param cacheable 是否开启缓存
* @param args
* @return
*/
public List<Object[]> queryForListBySql(String sql,boolean cacheable,Object...args) {
List<?> lis =null;
Query q = createSqlQuery(sql, args);
q.setCacheable(cacheable);
lis = q.list();
return (List<Object[]>) lis;
}
/**
* 执行sql语句返回list【map【String,object】】
* @param sql
* @param objects
* @return
*/
public List<?> queryForListMapBySql(String sql ,boolean cacheable,Object...objects){
Query q =createSqlQuery(sql, objects);
q.setCacheable(cacheable);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return q.list();
}
/**
* 执行sql语句返回list【map【String,object】】
* @param sql
* @param cacheable
* @param map
* @return
*/
public List<?> queryForListMapBySql2(String sql ,boolean cacheable,Map<String, Object> map){
Query q =createSqlQuery(sql, map);
q.setCacheable(cacheable);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
return q.list();
}
/**
* hql单一值查值
* @param hql
* @param cacheable 查询缓存
* @param args
* @return
*/
public Object uniqueQueryByHql(String hql,boolean cacheable, Object...args) {
Query q = createHqlQuery(hql, args);
q.setCacheable(cacheable);
return q.uniqueResult();
}
/**
* sql 单一值查值
* @param hql
* @param cacheable
* @param params
* @return
*/
public Object uniqueQueryByHQL(String hql,boolean cacheable, Map<String, Object> params) {
Query q = createHqlQuery(hql, params);
q.setCacheable(cacheable);
return q.uniqueResult();
}
/**
* sql 单一值查值
* @param sql
* @param cacheable
* @param params
* @return
*/
public Object uniqueQueryBySql(String sql,boolean cacheable, Map<String, Object> params) {
Query q = createSqlQuery(sql, params);
q.setCacheable(cacheable);
return q.uniqueResult();
}
/***
* sql 单一值查值
* @param sql
* @param args
* @return
*/
public Object uniqueQueryBySql(String sql,boolean cacheable,Object...args) {
Query q = createSqlQuery(sql, args);
q.setCacheable(cacheable);
return q.uniqueResult();
}
/**
* 本地命名查询返回List<Map>
* @return
* @throws Exception
*/
public List<?> queryForListByNameQuery(String key,boolean cacheable,Object...args)throws Exception{
List<Map<String, Object>> lis = null;
Session s = getSession();
Query q = s.getNamedQuery(key);
if (null!=args&&args.length>0) {
for (int i = 0; i < args.length; i++) {
q.setParameter(i, args[i]);
}
}
q.setCacheable(cacheable);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
lis = q.list();
return lis;
}
/**
* 分页查询
* @param hql
* @param pageindex
* @param limit
* @param args
* @return
*/
public List<?> PaginationByHql(String hql,int pageindex,int limit,boolean cacheable,Object...args) {
List<?> lis =null;
Query q =createHqlQuery(hql, args);
q.setCacheable(cacheable);
q.setFirstResult((pageindex-1)*limit);
q.setMaxResults(limit);
lis = q.list();
return lis;
}
/**
* 根据sql查指定条 不统计条数
* @param sql
* @param pageindex
* @param limit
* @param cacheable
* @param args
* @return
*/
public List<Map<String, Object>> PaginationBySQL(String sql,int pageindex,int limit,boolean cacheable,Map<String, Object> args) {
List<Map<String, Object>> lis =null;
Query q = createSqlQuery(sql, args);
q.setCacheable(cacheable);
q.setFirstResult((pageindex-1)*limit);
q.setMaxResults(limit);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
lis = q.list();
return lis;
}
/**
* 分页
* @param hql
* @param pageindex
* @param limit
* @param args
* @return
*/
public List<?> PaginationByHql(String hql,int pageindex,int limit,boolean cacheable,Map<String, Object> args) {
List<?> lis =null;
Query q = createHqlQuery(hql, args);
q.setCacheable(cacheable);
q.setFirstResult((pageindex-1)*limit);
q.setMaxResults(limit);
lis = q.list();
return lis;
}
/**
* 分页统计
* @param hql
* @param pageindex
* @param limit
* @param cacheable
* @param args
* @return
*/
public Pagination PaginationsByHQLMapParams(String hql,int pageindex,int limit,boolean cacheable,Map<String, Object> args ) {
Pagination page = new Pagination();
List<?> lis =null;
Query q =createHqlQuery(hql, args);
q.setCacheable(cacheable);
q.setFirstResult((pageindex-1)*limit);
q.setMaxResults(limit);
lis = q.list();
page.setData(lis);
page.setLimit(limit);
page.setPageindex(pageindex);
String total_hql=getRowCountHql(hql);
Integer total=Integer.valueOf(uniqueQueryByHQL(total_hql, cacheable, args).toString());
page.setTotal(total);
page.setMaxPage((total-1)/limit+1);
return page;
}
/**
*
* @param hql
* @param pageindex
* @param limit
* @param cacheable
* @param args
* @return
*/
public Pagination PaginationsByHQLArrayParams(String hql,int pageindex,int limit,boolean cacheable,Object ...args ) {
Pagination page = new Pagination();
List<?> lis =null;
Query q =createHqlQueryByArray(hql, args);
q.setCacheable(cacheable);
q.setFirstResult((pageindex-1)*limit);
q.setMaxResults(limit);
lis = q.list();
page.setData(lis);
page.setLimit(limit);
page.setPageindex(pageindex);
String total_hql=getRowCountHql(hql);
Integer total=Integer.valueOf(uniqueQueryByHql(total_hql, cacheable, args).toString());
page.setTotal(total);
page.setMaxPage((total-1)/limit+1);
return page;
}
public Pagination PaginationsBySQL(String sql,int pageindex,int limit,boolean cacheable,Object... args) {
Pagination page = new Pagination();
List<?> lis =null;
Query q = createSqlQuery(sql, args);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
q.setCacheable(cacheable);
q.setFirstResult((pageindex-1)*limit);
q.setMaxResults(limit);
lis = q.list();
page.setData(lis);
page.setLimit(limit);
page.setPageindex(pageindex);
String total_hql=String.format("select count(1) from (%s) as xxxx", sql);
Integer total=Integer.valueOf(uniqueQueryBySql(total_hql, cacheable, args).toString());
page.setTotal(total);
page.setMaxPage((total-1)/limit+1);
return page;
}
/**
* sql分布
* @param sql
* @param pageindex
* @param limit
* @param cacheable
* @param args
* @return
*/
public Pagination PaginationsBySQL(String sql,int pageindex,int limit,boolean cacheable,Map<String, Object> args) {
Pagination page = new Pagination();
List<?> lis =null;
Query q = createSqlQuery(sql, args);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
q.setCacheable(cacheable);
q.setFirstResult((pageindex-1)*limit);
q.setMaxResults(limit);
lis = q.list();
page.setData(lis);
page.setLimit(limit);
page.setPageindex(pageindex);
String total_hql=String.format("select count(1) from (%s) as xxxx", sql);
Integer total=Integer.valueOf(uniqueQueryBySql(total_hql, cacheable, args).toString());
page.setTotal(total);
page.setMaxPage((total-1)/limit+1);
return page;
}
public static final String ROW_COUNT = "select count(1) ";
public static final String FROM = "from";
public static final String HQL_FETCH = "fetch";
public static final String ORDER_BY = "order";
private String wrapProjection(String projection) {
if (projection.indexOf("select") == -1) {
return ROW_COUNT;
} else {
// return projection.replace("select", "select count(") + ") ";
return " select COUNT(*) ";
}
}
public String getRowCountHql(String hql) {
int fromIndex = hql.toLowerCase().indexOf(FROM);
String projectionHql = hql.substring(0, fromIndex);
hql = hql.substring(fromIndex);
String rowCountHql = hql.replace(HQL_FETCH, "");
int index = rowCountHql.indexOf(ORDER_BY);
if (index > 0) {
rowCountHql = rowCountHql.substring(0, index);
}
return wrapProjection(projectionHql) + rowCountHql;
}
/**
* 修改一个实体
* @param obj
*/
public void update(Object obj) {
getSession().update(obj);
}
/**
* 删除一个实体
* @param obj
*/
public void delete(Object obj) {
getSession().delete(obj);
}
/**
* 删除多个实体
* @param lis
*/
public void deleteList(List<?> lis) {
Session session = getSession();
for(int a=0;a<lis.size();a++){
session.delete(lis.get(a));
if (a % BATCH_SIZE == 0) {
session.flush();
session.clear();
}
}
}
/**
* 根据主键返回一个实体
* @param clazz
* @param id
* @return
*/
public Object get(Class<?> clazz,Object id) {
return getSession().get(clazz, (Serializable) id);
}
/**
* 执行HQL
* @param hql
* @param args
* @return
*/
public int executeHQL(String hql,Object...args) {
Query q =createHqlQuery(hql, args);
return q.executeUpdate();
}
/**
* 执行HQL
* @param hql
* @param map
* @return
*/
public int executeHQL(String hql,Map<String, Object> map) {
Query q = createHqlQuery(hql, map);
return q.executeUpdate();
}
/**
* 执行SQL
* @param sql
* @param args
* @return
*/
public int executeSQL(String sql,Object...args) {
Query q = createSqlQuery(sql, args);
return q.executeUpdate();
}
/**
* 根据sql查询返回一个map
* @param sql
* @param map
* @param keyname
* @param valuename
* @return
*/
public Map<String, ?> queryForSingleMap(String sql,Map<String, Object> map,String keyname,String valuename){
Query q = createSqlQuery(sql, map);
q.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);
List<Map<String, Object>> lis = q.list();
Map<String, Object> fmap = new HashMap<String, Object>();
if (null!=lis&&lis.size()>0) {
for (Map<String, Object> map2 : lis) {
fmap.put(map2.get(keyname).toString(), map2.get(valuename));
}
}
return fmap;
}
/**
* 创建hql 查询对象
* @param hql
* @param map
* @return
*/
public Query createHqlQuery(String hql,Map<String, Object> map){
Query q = getSession().createQuery(hql);
if (null!=map) {
Iterator<String> itera = map.keySet().iterator();
while (itera.hasNext()) {
String key =itera.next();
Object value =map.get(key);
if (value.getClass().isArray()) {
Object[] array=(Object[]) value;
q.setParameterList(key, array);
}
else{
q.setParameter(key, value);
}
}
}
return q;
}
/**
*
* @param hql
* @param args
* @return
*/
public Query createHqlQueryByArray(String hql,Object ...args){
Query q = getSession().createQuery(hql);
if (null!=args&&args.length>0) {
for (int i = 0; i < args.length; i++) {
q.setParameter(i, args[i]);
}
}
return q;
}
/**
* 创建sql查询对象
* @param sql
* @param map
* @return
*/
public Query createSqlQuery(String sql,Map<String, Object> map){
Query q = getSession().createSQLQuery(sql);
if (null!=map) {
Iterator<String> itera = map.keySet().iterator();
while (itera.hasNext()) {
String key =itera.next();
Object value =map.get(key);
if (value.getClass().isArray()) {
Object[] array=(Object[]) value;
q.setParameterList(key, array);
}
else{
q.setParameter(key, value);
}
}
}
return q;
}
/**
* 创建sql query
* @param sql
* @param args
* @return
*/
public Query createSqlQuery(String sql,Object ...args){
Query q = getSession().createSQLQuery(sql);
if (null!=args&&args.length>0) {
for (int i = 0; i < args.length; i++) {
q.setParameter(i, args[i]);
}
}
return q;
}
/**
* 创建HQL query
* @param hql
* @param args
* @return
*/
public Query createHqlQuery(String hql,Object ...args){
Query q = getSession().createQuery(hql);
if (null!=args&&args.length>0) {
for (int i = 0; i < args.length; i++) {
q.setParameter(i, args[i]);
}
}
return q;
}
}