`

HibernateUtils可以这样设计

    博客分类:
  • java
 
阅读更多
package org.ks4j.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
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.impl.CriteriaImpl;
import org.hibernate.transform.ResultTransformer;
import org.ks4j.orm.Compositor;
import org.ks4j.orm.Filtration;
import org.ks4j.orm.PageData;
import org.ks4j.orm.Filtration.MatchType;
import org.ks4j.orm.Compositor.CompositorType;
import org.ks4j.utils.ReflectionUtils;
import org.springframework.util.Assert;



/**
 * hibernate工具类
 * 
 *
 */
public class HibernateUtils
{
	/**
	 * 根据Criterion条件创建Criteria.
	 */
	public static Criteria createCriteria(Session session, Class entityClass, Criterion... criterions)
	{
		Criteria criteria = session.createCriteria(entityClass);
		for (Criterion criterion : criterions)
		{
			criteria.add(criterion);
		}
		return criteria;
	}

	/**
	 * 根据查询HQL与参数列表创建Query对象.
	 */
	public static Query createQuery(Session session, String hql, Object... values)
	{
		Assert.hasText(hql, "hql不能为空");
		Query query = session.createQuery(hql);

		for (int i = 0; i < values.length; i++)
		{
			query.setParameter(i, values[i]);
		}

		return query;
	}

	/**
	 * 根据查询HQL与参数列表创建Query对象.
	 */
	public static Query createQuery(Session session, String hql, Map<String, ?> values)
	{
		Assert.hasText(hql, "hql不能为空");
		Query query = session.createQuery(hql);
		if (values != null)
		{
			query.setProperties(values);
		}
		return query;
	}

	/**
	 * 创建Criterion
	 */
	private static Criterion createCriterion(String fieldName, Object fieldValue, MatchType matchType)
	{
		Criterion criterion = null;
		Assert.hasText(fieldName, "fieldName不能为空");
		switch (matchType)
		{
		case EQ: // =
			criterion = Restrictions.eq(fieldName, fieldValue);
			break;
		case LIKE: // like
			criterion = Restrictions.like(fieldName, (String) fieldValue, MatchMode.ANYWHERE);
			break;
		case LT: // <
			criterion = Restrictions.lt(fieldName, fieldValue);
			break;
		case LE: // <=
			criterion = Restrictions.le(fieldName, fieldValue);
			break;
		case GT: // >
			criterion = Restrictions.gt(fieldName, fieldValue);
			break;
		case GE: // >=
			criterion = Restrictions.ge(fieldName, fieldValue);
			break;
		}
		return criterion;
	}

	/**
	 * 执行count查询获得本次Criteria查询所能获得的对象总数.
	 */
	@SuppressWarnings("unchecked")
	private static long countCriteriaResult(Criteria criteria)
	{
		CriteriaImpl impl = (CriteriaImpl) criteria;

		// 先把Projection、ResultTransformer、OrderBy取出来,清空三者后再执行Count操作
		Projection projection = impl.getProjection();
		ResultTransformer resultTransformer = impl.getResultTransformer();

		List<CriteriaImpl.OrderEntry> orderEntries = null;
		orderEntries = (List) ReflectionUtils.getFieldValue(impl, "orderEntries");
		ReflectionUtils.setFieldValue(impl, "orderEntries", new ArrayList());

		// 执行Count查询
		long totalCount = (Long) criteria.setProjection(Projections.rowCount()).uniqueResult();

		// 将之前的Projection,ResultTransformer和OrderBy条件重新设回去
		criteria.setProjection(projection);

		if (projection == null)
		{
			criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
		}
		if (resultTransformer != null)
		{
			criteria.setResultTransformer(resultTransformer);
		}

		ReflectionUtils.setFieldValue(impl, "orderEntries", orderEntries);

		return totalCount;
	}

	/**
	 * 设置排序参数到Criteria对象
	 */
	public static Criteria setCompositorParameter(Criteria criteria, Compositor compositor)
	{
		if (compositor != null)
		{
			String fieldName = compositor.getFieldName();
			CompositorType compositorType = compositor.getCompositorType();
			switch (compositorType)
			{
			case ASC:
				criteria.addOrder(Order.asc(fieldName));
				break;
			case DESC:
				criteria.addOrder(Order.desc(fieldName));
				break;
			}
		}

		return criteria;
	}

	/**
	 * 设置过滤条件到Criteria对象
	 */
	public static Criteria setFiltrationParameter(Criteria criteria, Filtration... filtrations)
	{
		if (filtrations.length > 0)
		{
			List<Criterion> criterions = new ArrayList<Criterion>();
			for (Filtration filtration : filtrations)
			{
				Criterion criterion = null;
				if (!filtration.isMultiFilter())
				{
					criterion = createCriterion(filtration.getFieldName(), filtration.getFieldValue(), filtration.getMatchType());
					criterions.add(criterion);

				} else
				{
					//包含多个属性需要比较的情况,进行or处理.
					Disjunction disjunction = Restrictions.disjunction();
					for (String filedName : filtration.getFieldNames())
					{
						criterion = createCriterion(filedName, filtration.getFieldValue(), filtration.getMatchType());
						disjunction.add(criterion);
					}
					criterions.add(disjunction);
				}
			}
			for (Criterion criterion : criterions)
			{
				criteria.add(criterion);
			}
		}

		return criteria;
	}

	/**
	 * 设置过滤条件到Criteria对象
	 */
	public static Criteria setFiltrationParameter(Criteria criteria, List<Filtration> filtrationList)
	{
		if (filtrationList != null)
		{
			//Filtration[] filtrations = (Filtration[]) filtrationList.toArray();
			Filtration[] filtrations = new Filtration[filtrationList.size()];
			for(int i =0;i<filtrationList.size();i++)
			{
				filtrations[i] = filtrationList.get(i);
			}
			return setFiltrationParameter(criteria, filtrations);
		} else
		{
			return criteria;
		}
	}

	/**
	 * 设置分页参数到Criteria对象
	 */
	public static Criteria setParameter(Criteria criteria, PageData<?> pageData)
	{
		//第一步:设置查询条件
		setFiltrationParameter(criteria, pageData.getFiltrations());
		//第二步:读取记录总数
		if (pageData.getPagination().isReadTotalCount())
		{
			long totalCount = countCriteriaResult(criteria);
			pageData.getPagination().setTotalCount(totalCount);
		}

		//第三步:设置查询范围
		criteria.setFirstResult(pageData.getPagination().getCurrentlyPageFirstResoultIndex());
		criteria.setMaxResults(pageData.getPagination().getPageSize());

		//排序条件
		setCompositorParameter(criteria, pageData.getCompositor());

		return criteria;
	}
}

分享到:
评论

相关推荐

    HibernateUtils.java 绝对经典

    HibernateUtils.java文件超级经典哦...不信就下来试试看哦...呵呵...

    brahma-hibernateutils:Dropwizard中的实体注册使死亡变得简单

    package com.example.hibernateutils import javax.persistence.Entity ; @Entity public class Vishnu { } package com.example.hibernateutils import javax.persistence.Entity ; @Entity public class ...

    struts与hibernate结合的BBS系统

    当两者结合使用时,可以形成强大的企业级应用解决方案,尤其在构建BBS(Bulletin Board System,电子公告板系统)这样的交互性强、数据量大的应用时,这种结合显得尤为重要。 在"struts与hibernate结合的BBS系统"中...

    hibernate入门实例封装了HibernateUtil

    通过上述代码,我们可以看到HibernateUtil如何方便地管理Session和事务,以及如何实现数据的保存和查询。这只是一个基础的封装,实际项目中可能需要进一步优化,如添加异常处理、连接池管理等,以提高性能和健壮性。...

    struts-hibernate案例1

    在实际的Open Session In View(OSIV)模式中,Session通常在Controller(或Interceptor)层打开,贯穿整个请求过程,直到响应发送后关闭,这样可以确保在视图层也能访问到新鲜的数据,避免了延迟加载的问题。...

    Hibernate Annotation 学习笔记

    3. 更深入的学习:要深入了解Hibernate Annotation,可以参考官方文档`hibernate_annotations_3.2.1.pdf`(英文原稿)和中文翻译版`hibernate_annotations_zh.pdf`(满江红翻译)。这些文档详细介绍了各种注解的用法...

    hibernate模拟hibernatetemplate

    可以创建一个名为`HibernateUtils`的工具类,其中包含如`getSessionFactory()`、`executeTransaction()`等方法。 3. **实现CRUD操作**:模拟HibernateTemplate的基本功能,如增删改查,可以创建一系列静态方法,...

    Hibernate对数据库删除、查找、更新操作实例代码

    Session的load方法也可以根据主键id值来删除对应的记录,但是load方法支持延迟加载,get方法不支持延迟加载。load方法加载对象不存在时会抛出ObjectNotFoundException异常。 代码示例: ```java public void ...

    J2EE企业级项目开发-3期(KC007) 5.2 精解Hibernate之核心文件文档.doc

    工具类`HibernateUtils`就展示了这样的设计,它包含了静态的`Configuration`和`SessionFactory`变量,以及一个静态初始化块来加载配置文件并创建SessionFactory。开发人员可以通过`getSessionFactory()`方法获取...

    hql详细讲解,实例演示

    在`Classes`类的映射中,`&lt;set&gt;`标签表示一个班级可以包含多个学生,`inverse="true"`表明学生端维护班级关系,`cascade="all"`表示对集合中的每个实体执行级联操作。`&lt;key&gt;`定义了外键,`&lt;one-to-many&gt;`指定了与之...

    Hibernate注解编程实例

    也就是说,被标记的类将被视为一个持久化的对象,它可以被持久化到数据库中,并可以从数据库中加载出来。这通常用于表示数据库表中的行。 - **@Id**:此注解用于标注实体类中的某个属性作为其主键(标识符)。主键...

    hibernate 查询?Hibernate的HQL查询

    在这样的工具类基础上,我们可以轻松地在业务代码中构建和执行HQL查询,提高开发效率。 四、HQL的优势 1. **面向对象**:HQL使用类和属性代替表和列,与Java代码的风格一致。 2. **多态性**:支持查询不同类型的...

    hibernate查询缓存详细分析

    2. 设置缓存区域(region):`.setCacheRegion("myCacheRegion")`,这样可以将不同的查询结果放入不同的缓存区域,便于管理。 3. 控制缓存过期时间:可以使用`.setCacheTimeout(600)`设定缓存存活秒数。 六、查询...

    传智168期JavaEE hibernate 姜涛 day36~day37(by阿滔)

    通过Hibernate,开发者可以使用Java对象来实现数据库的查询、更新、删除和新增操作,而无需编写SQL语句。JavaEE课程中关于Hibernate的知识点涵盖从基础操作到复杂查询的多个方面,本文主要阐述hibernate的检索方式、...

    hibernate(WangJian_大总结_王健)

    HibernateUtils.getSessionFactory().openStatelessSession(); ``` 通过上述内容,我们可以了解到Hibernate框架在持久化层面上的一些关键技术点和实践建议。这有助于开发者更好地理解和应用Hibernate框架,从而构建...

    SSH_Configurations

    `HibernateUtils.java`则是一个实用工具类,它提供了一些便捷方法,如获取Session实例、开启和关闭事务等。这个类使得在SSH框架中使用Hibernate更加方便,避免了直接操作SessionFactory的复杂性。 `jndi.properties...

    Hibernate 缓存 实例

    而Oscache更倾向于页面级别的缓存,它可以缓存整个页面或页面的一部分,并设定过期时间,确保在特定时间内访问到相同的数据。 4. Hibernate的一级缓存 一级缓存是Session级别的,存储实体对象,不缓存普通属性。在...

    Generating Artifacts问题解决.doc

    at com.genuitec.eclipse.hibernate.util.HibernateUtils.getConfigFile(HibernateUtils.java:510) at com.genuitec.eclipse.hibernate.util.HTUtils.getConsoleConfigurationPreferences(HTUtils.java:184) at ...

    hibernate增删改查操作代码

    在Java开发中,Hibernate是一个非常流行的ORM(Object-Relational Mapping)框架,它简化了与数据库交互的过程,使得开发者可以通过操作对象而不是SQL语句来进行数据库的增删改查操作。本篇将详细介绍Hibernate中的...

Global site tag (gtag.js) - Google Analytics