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文件超级经典哦...不信就下来试试看哦...呵呵...
package com.example.hibernateutils import javax.persistence.Entity ; @Entity public class Vishnu { } package com.example.hibernateutils import javax.persistence.Entity ; @Entity public class ...
当两者结合使用时,可以形成强大的企业级应用解决方案,尤其在构建BBS(Bulletin Board System,电子公告板系统)这样的交互性强、数据量大的应用时,这种结合显得尤为重要。 在"struts与hibernate结合的BBS系统"中...
通过上述代码,我们可以看到HibernateUtil如何方便地管理Session和事务,以及如何实现数据的保存和查询。这只是一个基础的封装,实际项目中可能需要进一步优化,如添加异常处理、连接池管理等,以提高性能和健壮性。...
在实际的Open Session In View(OSIV)模式中,Session通常在Controller(或Interceptor)层打开,贯穿整个请求过程,直到响应发送后关闭,这样可以确保在视图层也能访问到新鲜的数据,避免了延迟加载的问题。...
3. 更深入的学习:要深入了解Hibernate Annotation,可以参考官方文档`hibernate_annotations_3.2.1.pdf`(英文原稿)和中文翻译版`hibernate_annotations_zh.pdf`(满江红翻译)。这些文档详细介绍了各种注解的用法...
可以创建一个名为`HibernateUtils`的工具类,其中包含如`getSessionFactory()`、`executeTransaction()`等方法。 3. **实现CRUD操作**:模拟HibernateTemplate的基本功能,如增删改查,可以创建一系列静态方法,...
Session的load方法也可以根据主键id值来删除对应的记录,但是load方法支持延迟加载,get方法不支持延迟加载。load方法加载对象不存在时会抛出ObjectNotFoundException异常。 代码示例: ```java public void ...
工具类`HibernateUtils`就展示了这样的设计,它包含了静态的`Configuration`和`SessionFactory`变量,以及一个静态初始化块来加载配置文件并创建SessionFactory。开发人员可以通过`getSessionFactory()`方法获取...
在`Classes`类的映射中,`<set>`标签表示一个班级可以包含多个学生,`inverse="true"`表明学生端维护班级关系,`cascade="all"`表示对集合中的每个实体执行级联操作。`<key>`定义了外键,`<one-to-many>`指定了与之...
也就是说,被标记的类将被视为一个持久化的对象,它可以被持久化到数据库中,并可以从数据库中加载出来。这通常用于表示数据库表中的行。 - **@Id**:此注解用于标注实体类中的某个属性作为其主键(标识符)。主键...
在这样的工具类基础上,我们可以轻松地在业务代码中构建和执行HQL查询,提高开发效率。 四、HQL的优势 1. **面向对象**:HQL使用类和属性代替表和列,与Java代码的风格一致。 2. **多态性**:支持查询不同类型的...
2. 设置缓存区域(region):`.setCacheRegion("myCacheRegion")`,这样可以将不同的查询结果放入不同的缓存区域,便于管理。 3. 控制缓存过期时间:可以使用`.setCacheTimeout(600)`设定缓存存活秒数。 六、查询...
通过Hibernate,开发者可以使用Java对象来实现数据库的查询、更新、删除和新增操作,而无需编写SQL语句。JavaEE课程中关于Hibernate的知识点涵盖从基础操作到复杂查询的多个方面,本文主要阐述hibernate的检索方式、...
HibernateUtils.getSessionFactory().openStatelessSession(); ``` 通过上述内容,我们可以了解到Hibernate框架在持久化层面上的一些关键技术点和实践建议。这有助于开发者更好地理解和应用Hibernate框架,从而构建...
`HibernateUtils.java`则是一个实用工具类,它提供了一些便捷方法,如获取Session实例、开启和关闭事务等。这个类使得在SSH框架中使用Hibernate更加方便,避免了直接操作SessionFactory的复杂性。 `jndi.properties...
而Oscache更倾向于页面级别的缓存,它可以缓存整个页面或页面的一部分,并设定过期时间,确保在特定时间内访问到相同的数据。 4. Hibernate的一级缓存 一级缓存是Session级别的,存储实体对象,不缓存普通属性。在...
at com.genuitec.eclipse.hibernate.util.HibernateUtils.getConfigFile(HibernateUtils.java:510) at com.genuitec.eclipse.hibernate.util.HTUtils.getConsoleConfigurationPreferences(HTUtils.java:184) at ...
在Java开发中,Hibernate是一个非常流行的ORM(Object-Relational Mapping)框架,它简化了与数据库交互的过程,使得开发者可以通过操作对象而不是SQL语句来进行数据库的增删改查操作。本篇将详细介绍Hibernate中的...