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. webpack+vue+iview使用vue-cli脚手架搭建

    1.安装nodejs环境 下载node.js.安装成功后再控制台输入 node -v 出现版本号则,安装成功. 如果没有出现 版本号 而是出现node 不是内部命令的话 需要配置一下环境变量,如果已经 ...

  2. A Gentle Guide to Machine Learning

    A Gentle Guide to Machine Learning Machine Learning is a subfield within Artificial Intelligence tha ...

  3. Java并发编程原理与实战三十八:多线程调度器(ScheduledThreadPoolExecutor)

    在前面介绍了java的多线程的基本原理信息:线程池的原理与使用 本文对这个java本身的线程池的调度器做一个简单扩展,如果还没读过上一篇文章,建议读一下,因为这是调度器的核心组件部分. 我们如果要用j ...

  4. 【AtCoder】ARC095 E - Symmetric Grid 模拟

    [题目]E - Symmetric Grid [题意]给定n*m的小写字母矩阵,求是否能通过若干行互换和列互换使得矩阵中心对称.n,m<=12. [算法]模拟 [题解]首先行列操作独立,如果已确 ...

  5. 05.UIDynamic

    CHENYILONG Blog 05.UIDynamic Fullscreen © chenyilong. Powered by Postach.io Blog

  6. 浅谈欧几里得算法求最大公约数(GCD)的原理及简单应用

    一.欧几里得算法及其证明 1.定义: 欧几里得算法又称辗转相除法,用于求两数的最大公约数,计算公式为GCD(a,b)=GCD(b,a%b): 2.证明: 设x为两整数a,b(a>=b)的最大公约 ...

  7. 20145202马超 2016-2017-2 《Java程序设计》第三次实验

    实验三 敏捷开发与XP实践 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的内容替换成IDEA 在IDEA中使用工具(Code->Re ...

  8. inspect的使用

    # -*- coding: utf-8 -*- # @Time : 2018/9/11 10:29 # @Author : cxa # @File : inspecttest.py # @Softwa ...

  9. netstat-ll-grep-nohup-df-supervisord

    ============http://man.linuxde.net/=========== 0 vi / n是查找下一个,alt+n是上一个  u撤销上一步,回到上一步 1. 根据进程号(4974) ...

  10. Owin WebApi版本控制

    public class WebApiControllerSelector : IHttpControllerSelector { private const string NamespaceKey ...