首页>代码>Apache Shiro+SpringMVC+Hibernate Search+Hibernate+Bootstrap企业信息管理系统基础框架搭建整合实例代码教程>/jeesite3/src/main/java/com/thinkgem/jeesite/common/persistence/BaseDao.java
package com.thinkgem.jeesite.common.persistence; import java.io.IOException; import java.io.Serializable; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.persistence.Id; import javax.persistence.PrePersist; import javax.persistence.PreUpdate; import org.apache.lucene.analysis.Analyzer; import org.apache.lucene.queryParser.ParseException; import org.apache.lucene.queryParser.QueryParser; import org.apache.lucene.search.BooleanClause; import org.apache.lucene.search.BooleanQuery; import org.apache.lucene.search.QueryWrapperFilter; import org.apache.lucene.search.Sort; import org.apache.lucene.search.BooleanClause.Occur; import org.apache.lucene.search.highlight.Formatter; import org.apache.lucene.search.highlight.Highlighter; import org.apache.lucene.search.highlight.InvalidTokenOffsetsException; import org.apache.lucene.search.highlight.QueryScorer; import org.apache.lucene.search.highlight.SimpleFragmenter; import org.apache.lucene.search.highlight.SimpleHTMLFormatter; import org.apache.lucene.util.Version; import org.hibernate.Criteria; import org.hibernate.Query; import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.criterion.Order; import org.hibernate.criterion.Projections; import org.hibernate.internal.CriteriaImpl; import org.hibernate.search.FullTextQuery; import org.hibernate.search.FullTextSession; import org.hibernate.search.Search; import org.hibernate.search.filter.impl.CachingWrapperFilter; import org.hibernate.search.query.DatabaseRetrievalMethod; import org.hibernate.search.query.ObjectLookupMethod; import org.hibernate.transform.ResultTransformer; import org.hibernate.transform.Transformers; import org.springframework.beans.factory.annotation.Autowired; import org.wltea.analyzer.lucene.IKAnalyzer; import com.thinkgem.jeesite.common.utils.Reflections; import com.thinkgem.jeesite.common.utils.StringUtils; /** * DAO支持类实现 * @author ThinkGem * @param <T> */ public class BaseDao<T> { /** * SessionFactory */ @Autowired private SessionFactory sessionFactory; /** * 实体类类型(由构造方法自动赋值) */ private Class<?> entityClass; /** * 构造方法,根据实例类自动获取实体类类型 */ public BaseDao() { entityClass = Reflections.getClassGenricType(getClass()); } /** * 获取 Session */ public Session getSession(){ return sessionFactory.getCurrentSession(); } /** * 强制与数据库同步 */ public void flush(){ getSession().flush(); } /** * 清除缓存数据 */ public void clear(){ getSession().clear(); } // -------------- QL Query -------------- /** * 去除hql的orderBy子句。 * @param qlString * @return */ private String removeOrders(String qlString) { Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(qlString); StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendReplacement(sb, ""); } m.appendTail(sb); return sb.toString(); } /** * 去除qlString的select子句。 * @param qlString * @return */ private String removeSelect(String qlString){ int beginPos = qlString.toLowerCase().indexOf("from"); return qlString.substring(beginPos); } /** * 创建 QL 查询对象 * @param qlString * @param parameter * @return */ public Query createQuery(String qlString, Parameter parameter){ Query query = getSession().createQuery(qlString); setParameter(query, parameter); return query; } /** * 设置查询参数 * @param query * @param parameter */ private void setParameter(Query query, Parameter parameter){ if (parameter != null) { Set<String> keySet = parameter.keySet(); for (String string : keySet) { Object value = parameter.get(string); //这里考虑传入的参数是什么类型,不同类型使用的方法不同 if(value instanceof Collection<?>){ query.setParameterList(string, (Collection<?>)value); }else if(value instanceof Object[]){ query.setParameterList(string, (Object[])value); }else{ query.setParameter(string, value); } } } } /** * QL 分页查询 * @param page * @param qlString * @param parameter * @return */ @SuppressWarnings("unchecked") public <E> Page<E> find(Page<E> page, String qlString, Parameter parameter){ // get count if (!page.isDisabled() && !page.isNotCount()){ String countQlString = "select count(*) " + removeSelect(removeOrders(qlString)); // page.setCount(Long.valueOf(createQuery(countQlString, parameter).uniqueResult().toString())); Query query = createQuery(countQlString, parameter); List<Object> list = query.list(); if (list.size() > 0){ page.setCount(Long.valueOf(list.get(0).toString())); }else{ page.setCount(list.size()); } if (page.getCount() < 1) { return page; } } // order by String ql = qlString; if (StringUtils.isNotBlank(page.getOrderBy())){ ql += " order by " + page.getOrderBy(); } Query query = createQuery(ql, parameter); // set page if (!page.isDisabled()){ query.setFirstResult(page.getFirstResult()); query.setMaxResults(page.getMaxResults()); } page.setList(query.list()); return page; } /** * QL 分页查询 * @param page * @param qlString * @return */ public <E> Page<E> find(Page<E> page, String qlString){ return find(page, qlString, null); } /** * QL 查询 * @param qlString * @return */ public <E> List<E> find(String qlString){ return find(qlString, null); } /** * QL 查询 * @param qlString * @param parameter * @return */ @SuppressWarnings("unchecked") public <E> List<E> find(String qlString, Parameter parameter){ Query query = createQuery(qlString, parameter); return query.list(); } /** * QL 查询所有 * @return */ @SuppressWarnings("unchecked") public List<T> findAll(){ return getSession().createCriteria(entityClass).list(); } /** * 获取实体 * @param id * @return */ @SuppressWarnings("unchecked") public T get(Serializable id){ return (T)getSession().get(entityClass, id); } /** * 获取实体 * @param qlString * @return */ public T getByHql(String qlString){ return getByHql(qlString, null); } /** * 获取实体 * @param qlString * @param parameter * @return */ @SuppressWarnings("unchecked") public T getByHql(String qlString, Parameter parameter){ Query query = createQuery(qlString, parameter); return (T)query.uniqueResult(); } /** * 保存实体 * @param entity */ public void save(T entity){ try { // 获取实体编号 Object id = null; for (Method method : entity.getClass().getMethods()){ Id idAnn = method.getAnnotation(Id.class); if (idAnn != null){ id = method.invoke(entity); break; } } // 插入前执行方法 if (StringUtils.isBlank((String)id)){ for (Method method : entity.getClass().getMethods()){ PrePersist pp = method.getAnnotation(PrePersist.class); if (pp != null){ method.invoke(entity); break; } } } // 更新前执行方法 else{ for (Method method : entity.getClass().getMethods()){ PreUpdate pu = method.getAnnotation(PreUpdate.class); if (pu != null){ method.invoke(entity); break; } } } } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } getSession().saveOrUpdate(entity); } /** * 保存实体列表 * @param entityList */ public void save(List<T> entityList){ for (T entity : entityList){ save(entity); } } /** * 更新 * @param qlString * @return */ public int update(String qlString){ return update(qlString, null); } /** * 更新 * @param qlString * @param parameter * @return */ public int update(String qlString, Parameter parameter){ return createQuery(qlString, parameter).executeUpdate(); } /** * 逻辑删除 * @param id * @return */ public int deleteById(Serializable id){ return update("update "+entityClass.getSimpleName()+" set delFlag='" + BaseEntity.DEL_FLAG_DELETE + "' where id = :p1", new Parameter(id)); } /** * 逻辑删除 * @param id * @param likeParentIds * @return */ public int deleteById(Serializable id, String likeParentIds){ return update("update "+entityClass.getSimpleName()+" set delFlag = '" + BaseEntity.DEL_FLAG_DELETE + "' where id = :p1 or parentIds like :p2", new Parameter(id, likeParentIds)); } /** * 更新删除标记 * @param id * @param delFlag * @return */ public int updateDelFlag(Serializable id, String delFlag){ return update("update "+entityClass.getSimpleName()+" set delFlag = :p2 where id = :p1", new Parameter(id, delFlag)); } // -------------- SQL Query -------------- /** * SQL 分页查询 * @param page * @param sqlString * @return */ public <E> Page<E> findBySql(Page<E> page, String sqlString){ return findBySql(page, sqlString, null, null); } /** * SQL 分页查询 * @param page * @param sqlString * @param parameter * @return */ public <E> Page<E> findBySql(Page<E> page, String sqlString, Parameter parameter){ return findBySql(page, sqlString, parameter, null); } /** * SQL 分页查询 * @param page * @param sqlString * @param resultClass * @return */ public <E> Page<E> findBySql(Page<E> page, String sqlString, Class<?> resultClass){ return findBySql(page, sqlString, null, resultClass); } /** * 创建 SQL 查询对象 * @param sqlString * @param parameter * @return */ public SQLQuery createSqlQuery(String sqlString, Parameter parameter){ SQLQuery query = getSession().createSQLQuery(sqlString); setParameter(query, parameter); return query; } /** * 设置查询结果类型 * @param query * @param resultClass */ private void setResultTransformer(SQLQuery query, Class<?> resultClass){ if (resultClass != null){ if (resultClass == Map.class){ query.setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP); }else if (resultClass == List.class){ query.setResultTransformer(Transformers.TO_LIST); }else{ query.addEntity(resultClass); } } } /** * SQL 分页查询 * @param page * @param sqlString * @param resultClass * @param parameter * @return */ @SuppressWarnings("unchecked") public <E> Page<E> findBySql(Page<E> page, String sqlString, Parameter parameter, Class<?> resultClass){ // get count if (!page.isDisabled() && !page.isNotCount()){ String countSqlString = "select count(*) " + removeSelect(removeOrders(sqlString)); // page.setCount(Long.valueOf(createSqlQuery(countSqlString, parameter).uniqueResult().toString())); Query query = createSqlQuery(countSqlString, parameter); List<Object> list = query.list(); if (list.size() > 0){ page.setCount(Long.valueOf(list.get(0).toString())); }else{ page.setCount(list.size()); } if (page.getCount() < 1) { return page; } } // order by String sql = sqlString; if (StringUtils.isNotBlank(page.getOrderBy())){ sql += " order by " + page.getOrderBy(); } SQLQuery query = createSqlQuery(sql, parameter); // set page if (!page.isDisabled()){ query.setFirstResult(page.getFirstResult()); query.setMaxResults(page.getMaxResults()); } setResultTransformer(query, resultClass); page.setList(query.list()); return page; } /** * SQL 查询 * @param sqlString * @return */ public <E> List<E> findBySql(String sqlString){ return findBySql(sqlString, null, null); } /** * SQL 查询 * @param sqlString * @param parameter * @return */ public <E> List<E> findBySql(String sqlString, Parameter parameter){ return findBySql(sqlString, parameter, null); } /** * SQL 查询 * @param sqlString * @param resultClass * @param parameter * @return */ @SuppressWarnings("unchecked") public <E> List<E> findBySql(String sqlString, Parameter parameter, Class<?> resultClass){ SQLQuery query = createSqlQuery(sqlString, parameter); setResultTransformer(query, resultClass); return query.list(); } /** * SQL 更新 * @param sqlString * @param parameter * @return */ public int updateBySql(String sqlString, Parameter parameter){ return createSqlQuery(sqlString, parameter).executeUpdate(); } // -------------- Criteria -------------- /** * 分页查询 * @param page * @return */ public Page<T> find(Page<T> page) { return find(page, createDetachedCriteria()); } /** * 使用检索标准对象分页查询 * @param page * @param detachedCriteria * @return */ public Page<T> find(Page<T> page, DetachedCriteria detachedCriteria) { return find(page, detachedCriteria, Criteria.DISTINCT_ROOT_ENTITY); } /** * 使用检索标准对象分页查询 * @param page * @param detachedCriteria * @param resultTransformer * @return */ @SuppressWarnings("unchecked") public Page<T> find(Page<T> page, DetachedCriteria detachedCriteria, ResultTransformer resultTransformer) { // get count if (!page.isDisabled() && !page.isNotCount()){ page.setCount(count(detachedCriteria)); if (page.getCount() < 1) { return page; } } Criteria criteria = detachedCriteria.getExecutableCriteria(getSession()); criteria.setResultTransformer(resultTransformer); // set page if (!page.isDisabled()){ criteria.setFirstResult(page.getFirstResult()); criteria.setMaxResults(page.getMaxResults()); } // order by if (StringUtils.isNotBlank(page.getOrderBy())){ for (String order : StringUtils.split(page.getOrderBy(), ",")){ String[] o = StringUtils.split(order, " "); if (o.length==1){ criteria.addOrder(Order.asc(o[0])); }else if (o.length==2){ if ("DESC".equals(o[1].toUpperCase())){ criteria.addOrder(Order.desc(o[0])); }else{ criteria.addOrder(Order.asc(o[0])); } } } } //get list page.setList(criteria.list()); return page; } /** * 使用检索标准对象查询 * @param detachedCriteria * @return */ public List<T> find(DetachedCriteria detachedCriteria) { return find(detachedCriteria, Criteria.DISTINCT_ROOT_ENTITY); } /** * 使用检索标准对象查询 * @param detachedCriteria * @param resultTransformer * @return */ @SuppressWarnings("unchecked") public List<T> find(DetachedCriteria detachedCriteria, ResultTransformer resultTransformer) { Criteria criteria = detachedCriteria.getExecutableCriteria(getSession()); criteria.setResultTransformer(resultTransformer); return criteria.list(); } /** * 使用检索标准对象查询记录数 * @param detachedCriteria * @return */ @SuppressWarnings("rawtypes") public long count(DetachedCriteria detachedCriteria) { Criteria criteria = detachedCriteria.getExecutableCriteria(getSession()); long totalCount = 0; try { // Get orders Field field = CriteriaImpl.class.getDeclaredField("orderEntries"); field.setAccessible(true); List orderEntrys = (List)field.get(criteria); // Remove orders field.set(criteria, new ArrayList()); // Get count criteria.setProjection(Projections.rowCount()); totalCount = Long.valueOf(criteria.uniqueResult().toString()); // Clean count criteria.setProjection(null); // Restore orders field.set(criteria, orderEntrys); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } return totalCount; } /** * 创建与会话无关的检索标准对象 * @param criterions Restrictions.eq("name", value); * @return */ public DetachedCriteria createDetachedCriteria(Criterion... criterions) { DetachedCriteria dc = DetachedCriteria.forClass(entityClass); for (Criterion c : criterions) { dc.add(c); } return dc; } // -------------- Hibernate search -------------- /** * 获取全文Session */ public FullTextSession getFullTextSession(){ return Search.getFullTextSession(getSession()); } /** * 建立索引 */ public void createIndex(){ try { getFullTextSession().createIndexer(entityClass).startAndWait(); } catch (InterruptedException e) { e.printStackTrace(); } } /** * 全文检索 * @param page 分页对象 * @param query 关键字查询对象 * @param queryFilter 查询过滤对象 * @param sort 排序对象 * @return 分页对象 */ @SuppressWarnings("unchecked") public Page<T> search(Page<T> page, BooleanQuery query, BooleanQuery queryFilter, Sort sort){ // 按关键字查询 FullTextQuery fullTextQuery = getFullTextSession().createFullTextQuery(query, entityClass); // 过滤无效的内容 if (queryFilter!=null){ fullTextQuery.setFilter(new CachingWrapperFilter(new QueryWrapperFilter(queryFilter))); } // 设置排序 if (sort!=null){ fullTextQuery.setSort(sort); } // 定义分页 page.setCount(fullTextQuery.getResultSize()); fullTextQuery.setFirstResult(page.getFirstResult()); fullTextQuery.setMaxResults(page.getMaxResults()); // 先从持久化上下文中查找对象,如果没有再从二级缓存中查找 fullTextQuery.initializeObjectsWith(ObjectLookupMethod.SECOND_LEVEL_CACHE, DatabaseRetrievalMethod.QUERY); // 返回结果 page.setList(fullTextQuery.list()); return page; } /** * 获取全文查询对象 */ public BooleanQuery getFullTextQuery(BooleanClause... booleanClauses){ BooleanQuery booleanQuery = new BooleanQuery(); for (BooleanClause booleanClause : booleanClauses){ booleanQuery.add(booleanClause); } return booleanQuery; } /** * 获取全文查询对象 * @param q 查询关键字 * @param fields 查询字段 * @return 全文查询对象 */ public BooleanQuery getFullTextQuery(String q, String... fields){ Analyzer analyzer = new IKAnalyzer(); BooleanQuery query = new BooleanQuery(); try { if (StringUtils.isNotBlank(q)){ for (String field : fields){ QueryParser parser = new QueryParser(Version.LUCENE_36, field, analyzer); query.add(parser.parse(q), Occur.SHOULD); } } } catch (ParseException e) { e.printStackTrace(); } return query; } /** * 设置关键字高亮 * @param query 查询对象 * @param list 设置高亮的内容列表 * @param subLength 截取长度 * @param fields 字段名 */ public List<T> keywordsHighlight(BooleanQuery query, List<T> list, int subLength, String... fields){ Analyzer analyzer = new IKAnalyzer(); Formatter formatter = new SimpleHTMLFormatter("<span class=\"highlight\">", "</span>"); Highlighter highlighter = new Highlighter(formatter, new QueryScorer(query)); highlighter.setTextFragmenter(new SimpleFragmenter(subLength)); for(T entity : list){ try { for (String field : fields){ String text = StringUtils.replaceHtml((String)Reflections.invokeGetter(entity, field)); //设置高亮字段 String description = highlighter.getBestFragment(analyzer,field, text); if(description!=null){ Reflections.invokeSetter(entity, fields[0], description); break; } Reflections.invokeSetter(entity, fields[0], StringUtils.abbr(text, subLength*2)); } } catch (IOException e) { e.printStackTrace(); } catch (InvalidTokenOffsetsException e) { e.printStackTrace(); } } return list; } }

微信网友_7558124162764800 LV2
6月18日
limufu LV1
6月17日
cytttt LV2
6月7日
sjwc88 LV4
5月1日
heng356 LV1
2月11日
zshldehao1 LV2
2月5日
zwjxxyxqf LV1
2024年11月1日
colecole LV3
2024年10月8日
HTML-WEB LV1
2024年5月22日
educationAAA LV11
2024年5月3日

ttg2025 LV3
8月22日
夜起星河 LV8
8月5日
3304324869
8月2日
暂无贡献等级
jock LV1
7月10日
陈必宇
7月1日
暂无贡献等级
微信网友_7558124162764800 LV2
6月18日
limufu LV1
6月17日
ningrong
6月13日
暂无贡献等级
微信网友_7532890418221056
6月11日
暂无贡献等级
cytttt LV2
6月7日