package com.ywx.core.orm.hibernate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Disjunction;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.internal.CriteriaImpl;
import org.hibernate.transform.ResultTransformer;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import com.google.common.collect.Sets;
import com.ywx.core.orm.Page;
import com.ywx.core.orm.PropertyFilter;
import com.ywx.core.orm.PropertyFilter.MatchType;
import com.ywx.core.utils.ReflectionUtils;
/**
* 封装SpringSide扩展功能的Hibernate DAO泛型基类.<br>
* 扩展功能包括分页查询,按属性过滤条件列表查询. 可在Service层直接使用,也可以扩展泛型DAO子类使用,见两个构造函数的注释.
*
* @param <T>
* DAO操作的对象类型
*/
@Transactional //此注解可以被继承
@SuppressWarnings({ "rawtypes", "unchecked" })
public class HibernateDao<T> extends SimpleHibernateDaoImpl<T> {
/**
* 用于Dao层子类使用的构造函数. 通过子类的泛型定义取得对象类型Class. eg. public class UserDao extends
* HibernateDao<User>{ }
*/
public HibernateDao() {
super();
}
/**
* 用于省略Dao层, Service层直接使用通用HibernateDao的构造函数. 在构造函数中定义对象类型Class. eg.
* HibernateDao<User> userDao = new HibernateDao<User, Long>(sessionFactory,User.class);
*/
public HibernateDao(final SessionFactory sessionFactory, final Class<T> entityClass) {
super(sessionFactory, entityClass);
}
/****************** 分页查询函数 ******************/
/**
* 分页获取全部对象.
*/
public Page<T> getAll(final Page<T> page) {
return findPage(page, null);
}
/**
* 按HQL分页查询.
*
* @param page
* 分页参数.不支持其中的orderBy参数.
* @param hql
* hql语句.
* @param values
* 数量可变的查询参数,按顺序绑定.
*
* @return 分页查询结果, 附带结果列表及所有查询时的参数.
*/
public Page<T> findPage(final Page<T> page, final String hql, final Object... values) {
Assert.notNull(page, "page不能为空");
Query q = createQuery(hql, values);
if (page.isAutoCount()) {
long totalCount = countHqlResult(hql, values);
page.setTotalCount(totalCount);
}
setPageParameter(q, page);
List result = q.list();
page.setResult(result);
return page;
}
/**
* 按HQL分页查询.
*
* @param page
* 分页参数.
* @param hql
* hql语句.
* @param values
* 命名参数,按名称绑定.
*
* @return 分页查询结果, 附带结果列表及所有查询时的参数.
*/
public Page<T> findPage(final Page<T> page, final String hql, final Map<String, ?> values) {
Assert.notNull(page, "page不能为空");
Query q = createQuery(hql, values);
if (page.isAutoCount()) {
long totalCount = countHqlResult(hql, values);
page.setTotalCount(totalCount);
}
setPageParameter(q, page);
List result = q.list();
page.setResult(result);
return page;
}
/**
* 按Criteria分页查询.
*
* @param page
* 分页参数.
* @param criterions
* 数量可变的Criterion.
*
* @return 分页查询结果.附带结果列表及所有查询时的参数.
*/
public Page<T> findPage(final Page<T> page, final Set refNames, Map<String, String> orderMap, final Criterion... criterions) {
Assert.notNull(page, "page不能为空");
Criteria c = createCriteria(refNames, orderMap, criterions);
if (page.isAutoCount()) {
int totalCount = countCriteriaResult(c);
page.setTotalCount(totalCount);
}
setPageParameter(c, page);
List result = c.list();
page.setResult(result);
return page;
}
/**
* 设置分页参数到Query对象,辅助函数.
*/
protected Query setPageParameter(final Query q, final Page<T> page) {
// hibernate的firstResult的序号从0开始
q.setFirstResult(page.getFirst() - 1);
q.setMaxResults(page.getPageSize());
return q;
}
/**
* 设置分页参数到Criteria对象,辅助函数.
*/
protected Criteria setPageParameter(final Criteria c, final Page<T> page) {
// hibernate的firstResult的序号从0开始
c.setFirstResult(page.getFirst() - 1);
c.setMaxResults(page.getPageSize());
if (page.isOrderBySetted()) {
String[] orderByArray = StringUtils.split(page.getOrderBy(), ',');
String[] orderArray = StringUtils.split(page.getOrder(), ',');
Assert.isTrue(orderByArray.length == orderArray.length, "分页多重排序参数中,排序字段与排序方向的个数不相等");
for (int i = 0; i < orderByArray.length; i++) {
if (Page.ASC.equals(orderArray[i])) {
c.addOrder(Order.asc(orderByArray[i]));
} else {
c.addOrder(Order.desc(orderByArray[i]));
}
}
}
return c;
}
/**
* 执行count查询获得本次Hql查询所能获得的对象总数.
*
* 本函数只能自动处理简单的hql语句,复杂的hql查询请另行编写count语句查询.
*/
protected long countHqlResult(final String hql, final Object... values) {
String fromHql = hql;
// select子句与order by子句会影响count查询,进行简单的排除.
fromHql = "from " + StringUtils.substringAfter(fromHql, "from");
fromHql = StringUtils.substringBefore(fromHql, "order by");
String countHql = "select count(*) " + fromHql;
try {
Long count = findUnique(countHql, values);
return count;
} catch (Exception e) {
throw new RuntimeException("hql can't be auto count, hql is:" + countHql, e);
}
}
/**
* 执行count查询获得本次Hql查询所能获得的对象总数.
*
* 本函数只能自动处理简单的hql语句,复杂的hql查询请另行编写count语句查询.
*/
protected long countHqlResult(final String hql, final Map<String, ?> values) {
String fromHql = hql;
// select子句与order by子句会影响count查询,进行简单的排除.
fromHql = "from " + StringUtils.substringAfter(fromHql, "from");
fromHql = StringUtils.substringBefore(fromHql, "order by");
String countHql = "select count(*) " + fromHql;
try {
Long count = findUnique(countHql, values);
return count;
} catch (Exception e) {
throw new RuntimeException("hql can't be auto count, hql is:" + countHql, e);
}
}
/**
* 执行count查询获得本次Criteria查询所能获得的对象总数.
*/
protected int countCriteriaResult(final Criteria c) {
CriteriaImpl impl = (CriteriaImpl) c;
// 先把Projection、ResultTransformer、OrderBy取出来,清空三者后再执行Count操作
Projection projection = impl.getProjection();
ResultTransformer transformer = impl.getResultTransformer();
List<CriteriaImpl.OrderEntry> orderEntries = null;
try {
orderEntries = (List) ReflectionUtils.getFieldValue(impl, "orderEntries");
ReflectionUtils.setFieldValue(impl, "orderEntries", new ArrayList());
} catch (Exception e) {
logger.error("不可能抛出的异常:{}", e.getMessage());
}
// 执行Count查询
int totalCount = (Integer) c.setProjection(Projections.rowCount()).uniqueResult();
// 将之前的Projection,ResultTransformer和OrderBy条件重新设回去
c.setProjection(projection);
没有合适的资源?快使用搜索试试~ 我知道了~
Spring4+SpringMVC4+Hibernate4整合源码
共548个文件
png:148个
js:113个
css:68个
5星 · 超过95%的资源 需积分: 16 1.8k 下载量 4 浏览量
2016-09-22
20:54:08
上传
评论 34
收藏 25.21MB RAR 举报
温馨提示
本资源为Spring4+SpringMVC4+Hibernate4整合源码,里面内置了一套对Hibernate底层Dao的封装,分页的封装,由于最近比较忙暂时没时间集成Spring Security。权限部分也还没来的及实现,本套框架的前端打算用bootstrap,后续会逐步更新本套框架,对于里面的架构存在缺陷的也欢迎各位提意见。
资源推荐
资源详情
资源评论
收起资源包目录
Spring4+SpringMVC4+Hibernate4整合源码 (548个子文件)
HibernateDao.class 15KB
SimpleHibernateDaoImpl.class 14KB
ReflectionUtils.class 8KB
DicConfigManager.class 7KB
HibernateUtils.class 5KB
Page.class 5KB
PropertyFilter.class 5KB
User.class 5KB
SimpleHibernateDao.class 4KB
DicConfigDao.class 3KB
DicResourceManager.class 3KB
Authority.class 3KB
Role.class 3KB
Department.class 3KB
DicDataUtils.class 2KB
DicConfig.class 2KB
TestSSH.class 2KB
UserControl.class 2KB
UserDetailsServiceImpl.class 2KB
PropertyFilter$PropertyType.class 2KB
SysUser.class 2KB
DicResource.class 2KB
PropertyFilter$MatchType.class 2KB
SpringContextHolder.class 1KB
DicResourceDao.class 1KB
PropertyFilter$OrderType.class 1KB
FrameControl.class 1KB
ConfigServlet.class 953B
UuidEntity.class 879B
UserServiceImpl.class 848B
AutoIdEntiy.class 801B
Base64PasswordEncoder.class 748B
UserDaoImpl.class 605B
CrudBaseSupport.class 501B
UserDao.class 299B
Constants.class 282B
UserService.class 254B
.classpath 722B
org.eclipse.wst.common.component 543B
org.eclipse.wst.jsdt.ui.superType.container 49B
bootstrap.css 124KB
bootstrap.min.css 104KB
bootstrap.min.css 103KB
style.css 103KB
animate.css 60KB
glyphicons.css 52KB
font-awesome.css 27KB
bootstrap-responsive.css 22KB
font-awesome.min.css 21KB
halflings.css 20KB
bootstrap-responsive.min.css 16KB
bootstrap-responsive.min.css 16KB
datepicker.css 16KB
select2_metro.css 14KB
style-metro.css 14KB
datetimepicker.css 12KB
chosen.css 12KB
fullcalendar.css 11KB
uniform.default.css 11KB
dropzone.css 10KB
style-responsive.css 9KB
light.css 9KB
inbox.css 9KB
purple.css 7KB
brown.css 7KB
blue.css 7KB
grey.css 7KB
default.css 7KB
pricing-tables.css 7KB
timeline.css 6KB
bootstrap-toggle-buttons.css 6KB
clockface.css 6KB
search.css 6KB
profile.css 5KB
bootstrap-modal.css 4KB
daterangepicker.css 4KB
jquery.fancybox.css 4KB
DT_bootstrap.css 4KB
jquery.nestable.css 3KB
blog.css 2KB
login.css 2KB
login-soft.css 2KB
bootstrap-wysihtml5.css 2KB
colorpicker.css 2KB
bootstrap-fileupload.css 2KB
bootstrap-tag.css 2KB
style-non-responsive.css 2KB
error.css 2KB
news.css 2KB
menu.css 2KB
multi-select-metro.css 2KB
lock.css 2KB
jquery.gritter.css 2KB
timepicker.css 2KB
coming-soon.css 2KB
jquery.fileupload-ui.css 1KB
bootstrap-tree.css 1KB
jqvmap.css 907B
jquery.tagsinput.css 904B
promo.css 770B
共 548 条
- 1
- 2
- 3
- 4
- 5
- 6
Vashon_杨博程
- 粉丝: 490
- 资源: 12
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
- 4
- 5
- 6
前往页