import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.hibernate.impl.CriteriaImpl;
import org.hibernate.transform.ResultTransformer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.Assert;
import org.springside.modules.utils.BeanUtils;
/**
* Hibernate的范型基类.
*
* 可以在service类中直接创建使用.也可以继承出DAO子类,在多个Service类中共享DAO操作.
* 参考Spring2.5自带的Petlinc例子,取消了HibernateTemplate.
* 通过Hibernate的sessionFactory.getCurrentSession()获得session,直接使用Hibernate原生API.
*
* @param <T> DAO操作的对象类型
* @param <PK> 主键类型
*
* @author calvin
*/
@SuppressWarnings("unchecked")
public class SimpleHibernateTemplate<T, PK extends Serializable> {
protected Logger logger = LoggerFactory.getLogger(getClass());
protected SessionFactory sessionFactory;
protected Class<T> entityClass;
public SimpleHibernateTemplate(SessionFactory sessionFactory, Class<T> entityClass) {
this.sessionFactory = sessionFactory;
this.entityClass = entityClass;
}
public Session getSession() {
return sessionFactory.getCurrentSession();
}
public SessionFactory getSessionFactory() {
return sessionFactory;
}
public void save(T entity) {
Assert.notNull(entity);
getSession().saveOrUpdate(entity);
logger.info("save entity: {}", entity);
}
public void delete(T entity) {
Assert.notNull(entity);
getSession().delete(entity);
logger.info("delete entity: {}", entity);
}
public void delete(PK id) {
Assert.notNull(id);
delete(get(id));
}
public List<T> findAll() {
return findByCriteria();
}
public Page<T> findAll(Page<T> page) {
return findByCriteria(page);
}
/**
* 按id获取对象.
*/
public T get(final PK id) {
return (T) getSession().load(entityClass, id);
}
/**
* 按HQL查询对象列表.
*
* @param hql hql语句
* @param values 数量可变的参数
*/
public List find(String hql, Object values) {
return createQuery(hql, values).list();
}
/**
* 按HQL分页查询.
* 暂不支持自动获取总结果数,需用户另行执行查询.
*
* @param page 分页参数.包括pageSize 和firstResult.
* @param hql hql语句.
* @param values 数量可变的参数.
*
* @return 分页查询结果,附带结果列表及所有查询时的参数.
*/
public Page<T> find(Page<T> page, String hql, Object values) {
Assert.notNull(page);
if (page.isAutoCount()) {
logger.warn("HQL查询暂不支持自动获取总结果数,hql为{}", hql);
}
Query q = createQuery(hql, values);
if (page.isFirstSetted()) {
q.setFirstResult(page.getFirst());
}
if (page.isPageSizeSetted()) {
q.setMaxResults(page.getPageSize());
}
page.setResult(q.list());
return page;
}
/**
* 按HQL查询唯一对象.
*/
public Object findUnique(String hql, Object values) {
return createQuery(hql, values).uniqueResult();
}
/**
* 按HQL查询Intger类形结果.
*/
public Integer findInt(String hql, Object values) {
return (Integer) findUnique(hql, values);
}
/**
* 按HQL查询Long类型结果.
*/
public Long findLong(String hql, Object values) {
return (Long) findUnique(hql, values);
}
/**
* 按Criterion查询对象列表.
* @param criterion 数量可变的Criterion.
*/
public List<T> findByCriteria(Criterion criterion) {
return createCriteria(criterion).list();
}
/**
* 按Criterion分页查询.
* @param page 分页参数.包括pageSize、firstResult、orderBy、asc、autoCount.
* 其中firstResult可直接指定,也可以指定pageNo.
* autoCount指定是否动态获取总结果数.
*
* @param criterion 数量可变的Criterion.
* @return 分页查询结果.附带结果列表及所有查询时的参数.
*/
public Page<T> findByCriteria(Page page, Criterion criterion) {
Assert.notNull(page);
Criteria c = createCriteria(criterion);
if (page.isAutoCount()) {
page.setTotalCount(countQueryResult(page, c));
}
if (page.isFirstSetted()) {
c.setFirstResult(page.getFirst());
}
if (page.isPageSizeSetted()) {
c.setMaxResults(page.getPageSize());
}
if (page.isOrderBySetted()) {
if (page.getOrder().endsWith(QueryParameter.ASC)) {
c.addOrder(Order.asc(page.getOrderBy()));
} else {
c.addOrder(Order.desc(page.getOrderBy()));
}
}
page.setResult(c.list());
return page;
}
/**
* 按属性查找对象列表.
*/
public List<T> findByProperty(String propertyName, Object value) {
Assert.hasText(propertyName);
return createCriteria(Restrictions.eq(propertyName, value)).list();
}
/**
* 按属性查找唯一对象.
*/
public T findUniqueByProperty(String propertyName, Object value) {
Assert.hasText(propertyName);
return (T) createCriteria(Restrictions.eq(propertyName, value)).uniqueResult();
}
/**
* 根据查询函数与参数列表创建Query对象,后续可进行更多处理,辅助函数.
*/
public Query createQuery(String queryString, Object values) {
Assert.hasText(queryString);
Query queryObject = getSession().createQuery(queryString);
if (values != null) {
for (int i = 0; i < values.length; i++) {
queryObject.setParameter(i, values[i]);
}
}
return queryObject;
}
/**
* 根据Criterion条件创建Criteria,后续可进行更多处理,辅助函数.
*/
public Criteria createCriteria(Criterion criterions) {
Criteria criteria = getSession().createCriteria(entityClass);
for (Criterion c : criterions) {
criteria.add(c);
}
return criteria;
}
/**
* 判断对象的属性值在数据库内是否唯一.
*
* 在修改对象的情景下,如果属性新修改的值(value)等于属性原值(orgValue)则不作比较.
* 传回orgValue的设计侧重于从页面上发出Ajax判断请求的场景.
* 否则需要SS2里那种以对象ID作为第3个参数的isUnique函数.
*/
public boolean isPropertyUnique(String propertyName, Object newValue, Object orgValue) {
if (newValue == null || newValue.equals(orgValue))
return true;
Object object = findUniqueByProperty(propertyName, newValue);
return (object == null);
}
/**
* 通过count查询获得本次查询所能获得的对象总数.
* @return page对象中的totalCount属性将赋值.
*/
protected int countQueryResult(Page<T> page, 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) BeanUtils.getFieldValue(impl, "orderEntries");
BeanUtils.setFieldValue(impl, "orderEntries", new ArrayList());
} catch (Exception e) {
logger.error("不可能抛出的异常:{}", e.getMessage());
}
// 执行Count查询
int totalCount = (Integer) c.setProjection(Projections.rowCount()).uniqueResult();
if (totalCount < 1)
return -1;
// 将之前的Projection和OrderBy条件重新设回去
c.setProjection(projection);
if (projection == null) {
c.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
}
if (transformer != null) {
c.setResultTransformer(transformer);
}
try {
BeanUtils.setFieldValue(impl, "orderEntries", orderEntries);
} catch (Exception e) {
logger.error("不可能抛出的异常:{}", e.getMessage());
}
return totalCount;
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/wuyashuan/archive/2009/04/27/4130406.aspx
分享到:
相关推荐
【标题】:Hibernate_范型_级联 在Java编程中,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发人员将数据库操作转换为面向对象的方式,从而简化了数据库应用的开发。范型(Generics)是Java 5引入的一...
《C++多范型设计》是一本深入探讨C++编程语言中模板技术的专著,由知名软件工程师James O. Coplien撰写,并由鄢爱兰、周辉等翻译成中文版,ISBN号为9787508318240。这本书的核心主题是C++中的泛型编程,它是C++编程...
本文提出的基于消息传递范型和客户机/服务器(Client/Server,简称C/S)范型双范型的主数据管理机制,能够有效解决MDM面临的问题。 消息传递范型是计算机科学中的一个基本概念,用于描述进程间通信的方式。在这范型...
《范型程序设计与 STL》是一本深入探讨C++编程中的关键概念和技术的书籍,主要聚焦于范型(Generic Programming)和标准模板库(Standard Template Library,简称STL)。范型编程是一种强大的软件开发方法,它允许...
《分布式系统原理与范型》作为一本系统介绍分布式系统基本原理与实践应用的书籍,涵盖了分布式系统设计与实现的核心理念。分布式系统指的是由多个可以独立运行的计算单元构成的系统,这些计算单元通过通信网络相互...
Java 范型Java 范型
《分布式系统原理与范型》是分布式系统中的经典教材,全书分为两部分:原理和范型。第一部分详细讨论了分布式系统的原理、概念和技术,其中包括通信、进程、命名、同步、一致性和复制、容错以及安全。第二部分给出了...
分布式系统原理与范型是IT领域中至关重要的一个主题,特别是在云计算、大数据处理以及现代互联网服务的背景下,理解和掌握分布式系统的概念与实践至关重要。本书作为第二版,深度探讨了这一领域的核心理论和常见模式...
书名:C++多范型设计 作者:[美]James O.Coplien 译者: 出版社:中国电力出版社 本书详细地介绍了从“应用领域”到“方案领域”的C++设计实现方法,以及开发者在设计思考和设计实践过程中需要用到的记法、图表和设计...
分布式系统原理与范型是计算机科学中的一个重要领域,它涵盖了多台计算机如何通过网络协同工作,以实现一个共同的目标。《分布式系统原理与范型(第二版)》这本书深入浅出地介绍了这一主题,旨在帮助读者理解分布式...
第2~9章讨论的是分布式系统的的原理、概念和技术,包括通信、进程、命名、同步化、一致性和复制、容错性以及安全性等,而分布式应用的开发方法(即范型)在第10~13章中进行了讨论。但是,与前一版不同的是,我们...
C++多范型设计.pdfC++多范型设计.pdfC++多范型设计.pdf
分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版) 分布式系统-原理与范型(第2版)
6. 模板的继承与多态:模板类可以作为基类,派生出其他模板类或非模板类。这种继承结合多态,可以构建出复杂的面向对象设计。 7. 跟进C++11及更高版本的特性,如模板别名、右值引用、完美转发等,进一步增强了多...
### Java范型攻略篇:深度解析与应用 #### 一、引言:Java范型的引入 在Java的发展历程中,范型(Generics)的引入标志着语言设计上的一个重要里程碑。自Java 1.5发布以来,范型成为了Java语言的重要特性之一,极...
分布式系统是一种由多台计算机组成的网络系统,这些计算机在用户看来就像是一个单一的系统。它们通过网络互相通信和协调工作,...通过理解分布式系统原理与范型,可以更好地设计和部署高效、可靠、可维护的分布式应用。
Tanenbaum教授是早期操作系统领域的知名学者,其著作深入浅出地介绍了分布式系统的基本原理和实现范型。 分布式系统的原理部分是该书的核心内容,涵盖了多个重要的概念和原理。首先,通信是分布式系统中最为基本的...
分布式系统原理与范型是计算机科学领域的一个重要研究方向,它涉及如何构建和管理由多个独立计算机组成的系统,这些系统能够协调工作,对外表现得就像单一的、协调一致的系统一样。在分布式系统中,透明性、开放性、...
华中科技大学 分布式系统原理与范型_考试_2009_答案