Hibernate 定义了 CriteriaSpecification 接口规范用来完成面向对象的条件查询,Criteria 和 DetachedCriteria 就是 CriteriaSpecification 的子接口。

在进行本篇的内容之前,我们先来大致说一说 Criteria 和 DetachedCriteria 的主要区别:

Criteria 和 DetachedCriteria 的创建的形式不一样, Criteria 是在线的,所以它是由 Hibernate Session 进行创建的;而 DetachedCriteria 是离线的,创建时无需 Session。

本篇完整实现如下:

一、导 jar 包

 antlr-2.7.6.jar
asm-commons-3.3.jar
commons-collections-3.1.jar
commons-fileupload-1.3.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
commons-logging-1.1.3.jar
dom4j-1.6.1.jar
freemarker-2.3.19.jar
hibernate3.jar
hibernate-jpa-2.0-api-1.0.1.Final.jar
javassist-3.12.0.GA.jar
jta-1.1.jar
mysql-connector-java-5.0.8-bin.jar
ognl-3.0.6.jar
slf4j-api-1.6.1.jar
spring-beans-4.3.8.RELEASE.jar
spring-context-4.3.8.RELEASE.jar
spring-core-4.3.8.RELEASE.jar
spring-expression-4.3.8.RELEASE.jar
spring-jdbc-4.3.8.RELEASE.jar
spring-orm-4.3.8.RELEASE.jar
spring-tx-4.3.8.RELEASE.jar
spring-web-4.3.8.RELEASE.jar
struts2-core-2.3.15.3.jar
struts2-spring-plugin-2.3.15.3.jar
xwork-core-2.3.15.3.jar

二、配置 Struts2 核心过滤器 (web.xml)

 <filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter> <filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

三、Jsp 表单查询页 (list.jsp)

 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="/struts-tags" prefix="s" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()
+":"+request.getServerPort()+path+"/";
%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head> <body>
<form action="${pageContext.request.contextPath}/queryCourseByCondition.action"
method="post">
<table width="88%" border="" class="emp_table" style="width:80%;"> <tr>
<td width="20%">姓名:</td>
<td><input type="text" name="userName" size="" value="" /></td>
</tr> <tr>
<td >性别:</td>
<td > <select name="gender" id="sex">
<option value="">--选择性别--</option>
<option value="男">男</option>
<option value="女">女</option>
</select>
</td>
</tr> <tr>
<td >年龄:</td>
<td ><input type="text" name="ageStart" size="" value="" /> 至 <input
type="text" name="ageEnd" size="" value="" /></td>
</tr> <tr>
<td>是否上传简历:</td>
<td ><select name="isUpload" id="isUpload">
<option value="">--请选择--</option>
<option value="">有</option>
<option value="">无</option>
</select>
</td>
</tr> <tr>
<td>信息备注:</td>
<td><input type="text" name="remark" size="" value="" /></td>
</tr> </table><br>
<input type="submit" value="查询"/>
<hr>
<table width="97%" border="" > <tr class="henglan" style="font-weight:bold;">
<td width="14%" align="center">姓名</td>
<td width="13%" align="center">性别</td>
<td width="13%" align="center">年龄</td>
<td width="18%" align="center">简历</td>
<td width="20%" align="center">备注</td>
</tr> <%--数据展示 --%>
<s:iterator>
<tr class="tabtd1">
<td align="center"><s:property value="userName"/> </td>
<td align="center"><s:property value="gender"/></td>
<td align="center"><s:property value="age"/></td>
<td align="center"><s:property value="fileName"/></td>
<td align="center"><s:property value="remark"/></td>
</tr>
</s:iterator>
</table>
</form>
</body>
</html>

四、封装 UserBean (User.java)

 package com.fhcq.bean;

 import java.io.Serializable;

 public class User implements Serializable {

 	private Integer userID;
private String userName;
private String gender;
private Integer age;
private String fileName;
private String remark; public Integer getUserID() {
return userID;
}
public void setUserID(Integer userID) {
this.userID = userID;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getFileName() {
return fileName;
}
public void setFileName(String fileName) {
this.fileName = fileName;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
} }

五、配置数据库表生成策略 (User.hbm.xml)

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.fhcq.bean"> <!-- name是类名 如果有包就不用写全类名,否则要写。 table 表示对应的表名 。建议都要写 -->
<class name="User" table="user"> <!--使用Id配置主键 必须配置 -->
<id name="userID" column="userID">
<!--目前照常,主键生成策略 -->
<generator class="native"></generator>
</id> <property name="userName" column="userName"></property>
<property name="gender" column="gender"></property>
<property name="age" column="age"></property>
<property name="filename" column="filename"></property>
<property name="remark" column="remark"></property> </class>
</hibernate-mapping>

六、设置数据库连接参数 (hibernate.cfg.xml)

 <!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration>
<session-factory name="foo"> <!-- 配置数据库驱动 -->
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- 要连接数控的用户名 -->
<property name="hibernate.connection.username">root</property>
<!-- 密码 -->
<property name="hibernate.connection.password">123456</property>
<!-- 连接数据库的路径 那个服务器 那个数据库 -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost:3306/usermanager
</property> <!-- 操作的时候显示操做过程中的sql语句 -->
<property name="show_sql">true</property>
<!-- 格式化它要显示的sql语句 -->
<property name="format_sql">true</property>
<!-- 是否要自动创建表 -->
<property name="hbm2ddl.auto">update</property>
<!-- 事务自动提交 -->
<property name="connection.autocommit">true</property> <!-- 优化选项 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 导入映射文件 -->
<mapping resource="com/fhcq/bean/User.hbm.xml" /> </session-factory>
</hibernate-configuration>

七、配置 Struts (struts.xml)

 <?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd"> <struts> <!--修改struct2称为开发模式,修改配置之后会自动加载 -->
<constant name="struts.devMode" value="true"></constant> <package name="package1" extends="struts-default">
<!-- 多条件查询 -->
<action name="queryCourseByCondition"
class="com.fhcq.action.QueryUserByConditionAction"
method="queryCourseByCondition">
<result name="success">/index.jsp</result>
</action>
</package> </struts>

八、表示层

8.1、QueryUserByConditionAction

 package com.fhcq.action;

 import java.util.List;

 import com.fhcq.bean.User;
import com.fhcq.service.IUserService;
import com.fhcq.service.UserServiceImpl;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.util.ValueStack; public class QueryUserByConditionAction extends ActionSupport implements
ModelDriven<User>{ User user= new User();
private String ageStart;
private String ageEnd;
private String isUpload;
IUserService service; public String queryCourseByCondition(){ String userName = user.getUserName();
String gender = user.getGender();
String remark = user.getRemark(); List<User> userlist = service.queryUserByCondition
(userName,gender,ageStart,ageEnd,isUpload,remark);
System.out.println("QueryUserByConditionAction queryUser() userlist=
"+userlist); ActionContext context = ActionContext.getContext();
ValueStack valueStack = context.getValueStack();
valueStack.push(userlist); return SUCCESS;
} @Override
public User getModel() {
// TODO Auto-generated method stub
return user;
} public User getUser() {
return user;
} public void setUser(User user) {
this.user = user;
} public String getIsUpload() {
return isUpload;
} public void setIsUpload(String isUpload) {
this.isUpload = isUpload;
} public String getAgeStart() {
return ageStart;
} public void setAgeStart(String ageStart) {
this.ageStart = ageStart;
} public String getAgeEnd() {
return ageEnd;
} public void setAgeEnd(String ageEnd) {
this.ageEnd = ageEnd;
} public IUserService getService() {
return service;
} public void setService(IUserService service) {
this.service = service;
} }

九、业务层

9.1、QueryUserService

 package com.fhcq.service;

 import java.util.List;

 import com.fhcq.bean.User;

 public interface IUserService {

  	List<User> queryUserByCondition(String userName, String gender,String ageStart,
String ageEnd, String isUpload,String remark);
}

9.2、QueryUserServiceImpl

 package com.fhcq.service;

 import java.util.List;

 import com.fhcq.bean.User;
import com.fhcq.dao.IUserDao;
import com.fhcq.dao.UserDaoImpl; public class UserServiceImpl implements IUserService{ IUserDao dao; @Override
public List<User> queryUserByCondition(String userName, String gender,
String ageStart, String ageEnd, String isUpload,String remark) {
// TODO Auto-generated method stub
List<User> queryUserByCondition = dao.queryUserByCondition
(userName,gender,ageStart,ageEnd,isUpload,remark);
return queryUserByCondition;
} public IUserDao getDao() {
return dao;
} public void setDao(IUserDao dao) {
this.dao = dao;
} }

十、数据持久化层

10.1、QueryUserDao

 package com.fhcq.dao;

 import java.util.List;

 import com.fhcq.bean.User;

 public interface IUserDao {

 	List<User> queryUserByCondition(String userName, String gender, String ageStart,
String ageEnd, String isUpload, String remark); }

Criteria 在线实现多条件查询:

10.2、配置 Spring (applicationContext.xml)

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="myUserDaoImpl" class="com.fhcq.dao.UserDaoImpl"></bean> <bean id="service" class="com.fhcq.service.UserServiceImpl" >
<property name="dao" ref="myUserDaoImpl"></property>
</bean> </beans>

10.3、HibernateUtils 方法封装

 package com.fhcq.utils;

 import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; public class HibernateUtils { static SessionFactory sessionFactory;
static {
Configuration configure = new Configuration().configure();
sessionFactory = configure.buildSessionFactory();
//增加 关闭虚拟机的时候自动释放
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println("当运行结束的时候执行!");
sessionFactory.close();
}
}));
} public static Session getSession(){
Session openSession = sessionFactory.openSession();
return openSession;
} public static Session getCurrentSession(){
Session openSession = sessionFactory.getCurrentSession();
return openSession;
}
}

10.4、QueryUserDaoImpl

 package com.fhcq.dao;

 import java.util.List;

 import org.apache.commons.lang3.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.fhcq.bean.User;
import com.fhcq.utils.HibernateUtils; public class UserDaoImpl implements IUserDao{ @Override
public List<User> queryUserByCondition(String userName, String gender,
String ageStart, String ageEnd, String isUpload, String remark) {
// TODO Auto-generated method stub //如果查询页所有条件都没未填选的话,点击查询按钮则查询所有用户
if(StringUtils.isBlank(userName) && StringUtils.isBlank(gender) &&
StringUtils.isBlank(ageStart) && StringUtils.isBlank(ageEnd) &&
StringUtils.isBlank(isUpload) && StringUtils.isBlank(remark)){ Session session = HibernateUtils.getSession();
session.beginTransaction();
//-----------------------------
Query createQuery = session.createQuery("from User");
List<User> userlist = createQuery.list();
//------------------------------
session.getTransaction().commit();
session.close();
return userlist; }else{ Configuration configure = new Configuration().configure();
SessionFactory sessionFactory = configure.buildSessionFactory();
Session openSession = sessionFactory.openSession();
//------------------------------ Criteria createCriteria = openSession.createCriteria(User.class); if(StringUtils.isNotBlank(userName)){
createCriteria.add(Restrictions.like("userName", userName.replace
("", "")));
}
if(StringUtils.isNotBlank(gender)){
createCriteria.add(Restrictions.eq("gender", gender));
}
if(StringUtils.isNotBlank(ageStart)){
Integer ageStart1 =Integer.parseInt(ageStart);
createCriteria.add(Restrictions.ge("age", ageStart1));
}
if(StringUtils.isNotBlank(ageEnd)){
Integer ageEnd1 =Integer.parseInt(ageEnd);
createCriteria.add(Restrictions.le("age", ageEnd1));
}
if(StringUtils.isNotBlank(isUpload)){ if("".equals(isUpload)){ createCriteria.add(Restrictions.isNotNull("fileName")); }else{ createCriteria.add(Restrictions.isNull("fileName"));
} }
if(StringUtils.isNotBlank(remark)){
createCriteria.add(Restrictions.like("remark",
remark.replace("", "")));
} List userlist = createCriteria.list(); //------------------------------
openSession.close();
sessionFactory.close();
return userlist; }
}
}

DetachedCriteria 离线实现多条件查询:

10.2、配置 Spring (applicationContext.xml)

 <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd"> <bean id="mysessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<!-- hibernate.cfg.xml 告诉springHibernate的配置文件在哪 -->
<property name="configLocation" value="classpath:hibernate.cfg.xml">
</property>
</bean> <bean id="myHibernateTemplate"
class="org.springframework.orm.hibernate3.HibernateTemplate">
<property name="sessionFactory" ref="mysessionFactory"></property>
</bean> <bean id="myuserDaoImpl" class="com.fhcq.dao.UserDaoImpl">
<property name="hibernateTemplate" ref="myHibernateTemplate"></property>
</bean> <bean id="service" class="com.fhcq.service.UserServiceImpl" >
<property name="dao" ref="myuserDaoImpl"></property>
</bean> </beans>

10.3、QueryUserDaoImpl

 package com.fhcq.dao;

 import java.util.List;

 import org.apache.commons.lang3.StringUtils;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Restrictions;
import org.hibernate.criterion.MatchMode;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport; import com.fhcq.bean.User; public class UserDaoImpl extends HibernateDaoSupport implements IUserDao{ List<User> findByCriteria ; @Override
public List<User> queryUserByCondition(String userName, String gender,
String ageStart, String ageEnd,String isUpload, String remark) {
// TODO Auto-generated method stub
//如果查询页所有条件都没未填选的话,点击查询按钮则查询所有用户
if(StringUtils.isBlank(userName) && StringUtils.isBlank(gender) &&
StringUtils.isBlank(ageStart) && StringUtils.isBlank(ageEnd) &&
StringUtils.isBlank(isUpload) && StringUtils.isBlank(remark)){ findByCriteria = (List<User>) getHibernateTemplate().findByCriteria
(DetachedCriteria.forClass(User.class)); }else{ DetachedCriteria forClass = DetachedCriteria.forClass(User.class);
if(StringUtils.isNotBlank(userName)){
forClass.add(Restrictions.like("userName", userName.replace
("", ""), MatchMode.ANYWHERE));
}
if(StringUtils.isNotBlank(gender)){
forClass.add(Restrictions.eq("gender", gender));
}
if(StringUtils.isNotBlank(ageStart)){
Integer ageStart1 =Integer.parseInt(ageStart);
forClass.add(Restrictions.ge("age", ageStart1));
}
if(StringUtils.isNotBlank(ageEnd)){
Integer ageEnd1 =Integer.parseInt(ageEnd);
forClass.add(Restrictions.le("age", ageEnd1));
}
if(StringUtils.isNotBlank(isUpload)){ if("".equals(isUpload)){ forClass.add(Restrictions.isNotNull("fileName"));
}else{ forClass.add(Restrictions.isNull("fileName"));
}
}
if(StringUtils.isNotBlank(remark)){
forClass.add(Restrictions.like("remark",remark.replace
("", ""), MatchMode.ANYWHERE));
} findByCriteria = (List<User>) getHibernateTemplate().findByCriteria
(forClass);
}
if(findByCriteria.size()>0){
return findByCriteria;
}
return null;
} }

基于 SSH 框架的 Criteria 和 DetachedCriteria 多条件查询的更多相关文章

  1. 基于SSH框架的学生公寓管理系统的质量属性

    系统名称:学生公寓管理系统 首先介绍一下学生公寓管理系统,在学生公寓管理方面,针对学生有关住宿信息问题进行管理,学生公寓管理系统主要包含了1)学生信息记录:包括学号.姓名.性别.院系.班级:2)住宿信 ...

  2. 基于ssh框架的在线考试系统开发的质量属性

    我做的系统是基于ssh框架的在线考试系统.在线考试系统有以下几点特性:(1)系统响应时间需要非常快,可以迅速的出题,答题.(2)系统的负载量也需要非常大,可以支持多人在线考试(3)还有系统的安全性也需 ...

  3. 基于SSH框架的考勤管理系统的设计与实现

    基于SSH框架的考勤管理系统的设计与实现

  4. 基于SSH框架的在线考勤系统开发的质量属性

    我要开发的是一个基于SSH框架的在线考勤系统. 质量属性是指影响质量的相关因素,下面我将分别从6个系统质量属性(可用性,易用性,可修改性,性能,安全性,可测试性)来分析我的系统,以及如何实现这些质量属 ...

  5. 基于SSH框架开发的《高校大学生选课系统》的质量属性的实现

    基于SSH框架开发的<高校大学生选课系统>的质量属性的实现 对于可用性采取的是错误预防战术,即阻止错误演变为故障:在本系统主要体现在以下两个方面:(1)对于学生登录模块,由于初次登陆,学生 ...

  6. 如何实现基于ssh框架的投票系统的的质量属性

    如何实现基于ssh框架的投票系统的的质量属性: 项目 :网上考试系统 我做的是网上考试系统,因为标准化的考试越来越重要,而通过计算机进行标准化判卷,系统会自动判卷出成绩,组织考试的人不用组织人员打印试 ...

  7. 基于SSH框架的学生选课质量属性分析

    系统:学生选课系统 框架:SSH(Struts2+Spring+Hibernate) 我做的是基于SSH框架的学生选课系统.学生选课系统的特性:①系统响应时间短,能够快速调出课程数据供学生选课提交.② ...

  8. 基于SSH框架的网上书店系统开发的质量属性

    基于SSH框架的网上书店系统开发的质量属性 对于我的基于SSH框架的网上书店系统的开发要实现的质量属性有可用性.可修改性.性能.安全性.易用性和可测试性. 1.对于可用性方面的战术: 可用性(Avai ...

  9. 文献综述十八:基于SSH框架的进销存管理系统设计与实现

    一.基本信息 标题:基于SSH框架的进销存管理系统设计与实现 时间:2017 出版源:内蒙古科技与经济 文件分类:对框架的研究 二.研究背景 进销存管理系统在各企业中广泛应用,使用SSH框架,很大程度 ...

随机推荐

  1. CSS3 渐变,rgba与hsla

    radial-gradient:径向渐变 ellipse:椭圆形渐变默认,circle:圆形渐变 定义渐变大小,指定终点位置: farthest-corner:默认,指定径向渐变的半径长度为:从圆心到 ...

  2. linux服务器上修改oracle数据库的字符集

    linux服务器上以dba身份进入:sqlplus / as sysdba; 依次执行以下命令:shutdown immediate; startup mount; alter system enab ...

  3. PHP数组的遍历

    对于012345...这样的数组可以用for进行遍历 $arr=array('a','b','c','d','e'); for($key=0;$key<count($arr);$key++){ ...

  4. xpath定位中详解id 、starts-with、contains、text()和last() 的用法

    1.XPATH使用方法 使用XPATH有如下几种方法定位元素(相比CSS选择器,方法稍微多一点): a.通过绝对路径定位元素(不推荐!) WebElement ele = driver.findEle ...

  5. python学习笔记3--set

    #int string list tuple dict bool float set #集合:天生去重 s=set() #空的集合 s2={'} ls=[1,2,3,4,5,6,7,1,2,3,4] ...

  6. div+css+jQuery简单实现投票功能

    昨天看到C#群里有人问一个投票功能如何实现... 我对此很感兴趣,为了练习一下,就有了以下代码. 投票功能使用jQuery实现..纯html代码...数据通过json字符串传递,通过 eval转换为j ...

  7. Linux下inittab文件详解

    /etc/inittab文件详解 Linux系统的启动过程为:加电自检-->根据BIOS中的设置从指定的设备启动-->找到设备MBR中的bootloader引导启动系统-->启动ke ...

  8. 【疑点】<p></p>标签为什么不能包含块级标签?还有哪些特殊的HTML标签?

    最近,在码代码的时候,就是下面的这段代码,我犯了一个很不起眼,但犯了就致命的BUG. <body> <p> <ol> <li>Hello</li& ...

  9. js中同步与异步处理方法

    在使用异步请求时,有时需要将异步请求的结果返回给另一个js函数,此种情况下会出现未等异步请求返回请求结果,该发送请求所在js函数已经执行完后续操作,即已经执行return ,这样会导致return的结 ...

  10. 富文本存储型XSS的模糊测试之道

    富文本存储型XSS的模糊测试之道 凭借黑吧安全网漏洞报告平台的公开案例数据,我们足以管中窥豹,跨站脚本漏洞(Cross-site Script)仍是不少企业在业务安全风险排查和修复过程中需要对抗的“大 ...