Criteria查询初学者的采纳点哦
一、Hibernate提供了5种检索对象的方式
1.导航对象图检索方式:根据已经加载的对象导航到其他对象 from Emp e group by e.dept.deptName
2.OID检索方式:按照对象的OID来检索对象 get/load
3.HQL检索方式:使用面向对象的HQL查询语言
4.QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口
5.本地SQL检索方式:使用本地数据库的SQL查询语句 createSqlQuery();
二、什么是Criteria查询(使用QBC(Query By Criteria)API来检索对象)
解析:Criteria查询是Hibernate提供的另一种查询方式。
主要由Criteria、Criterion接口和Restrictions类组成,他支持在运行时动态生成查询语句。
三、实例来讲解Criteria的用法。
(一)首先我们我们先来熟悉一下createCriteria()方法
Criteria criteria = session.createCriteria(Emp.class);
解析:使用session.createCriteria()方法创建了criteria对象,createCriteria()方法的参数是持久化类的类型。 List<Emp> list = criteria.list(); 解析:使用criteria.list()执行查询语句,list()方法返回List集合。
@Test
//1.查询所有部分信息
public void SelectPartMessage(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction(); Criteria criteria = session.createCriteria(Emp.class);
List<Emp> list = criteria.list();
for (Emp dept : list) {
System.out.println(dept.getEmpName());
}
tx.commit(); }
(二)根据条件查询
1)比较运算符
| HQL运算符 | Criteria运算方法 | 说明 |
| = | SimpleExpression Restrictions.eq(String propertyName,Object value) | 等于 |
| <> | SimpleExpression Restrictions.ne(String propertyName,Object value) | 不等于 |
| > | SimpleExpression Restrictions.gt(String propertyName,Object value) | 大于 |
| >= | SimpleExpression Restrictions.ge(String propertyName,Object value) | 大于等于 |
| < | SimpleExpression Restrictions.lt(String propertyName,Object value) | 小于 |
| <= | SimpleExpression Restrictions.le(String propertyName,Object value) | 小于等于 |
| is null | Criteria Restrictions.isNull(String propertyName) | 等于空值 |
| is not null | Criteria Restrictions.isNotNull(String propertyName) | 非空值 |
Criterion eq = Restrictions.eq("empName", "微冷的雨");
解析: Restrictions其方法的返回值是Criterion类型
@Test
//按条件查询
public void HasMessage(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Emp.class); Criterion eq = Restrictions.eq("empName", "微冷的雨");
criteria=criteria.add(eq);
List<Emp> list=criteria.list();
for(Emp emps:list){
System.out.println(emps.getEmpName());
}
}
criteria.createAlias("dept", "d");
解析:查看部门下的员工,用createAlias()方法获取其部门的属性值(必须起方法才能获取部门属性值);dept(在关联emp的属性值在emp定义多对一关联)d是别名
Criterion criterion = Restrictions.eq("d.deptName", "开发部");
解析:d.deptName获取属性值
/**
* 1.3 关联查询 查询“开发部”所有员工
*
*/
@Test
public void connectTest(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Emp.class); //Emp中关联的dept对象,起一个别名 d
criteria.createAlias("dept", "d"); Criterion criterion = Restrictions.eq("d.deptName", "开发部"); criteria.add(criterion); List<Emp> list = criteria.list(); for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
}
2)范围运算符
| HQL运算符 | Criteria运算方法 | 说明 |
| in(列表) |
Criterion Restrictions.in(String propertyName,Collecyion values) 或者 Criterion Restrictions.in(String propertyName,Object[] values) |
等于类表中的某一个值 |
| not in(列表) | Criterion Restrictions.not( Restrictions.in()) | 不等于列表中的任意一个值 |
| between 值1 and 值2 | Criterion Restrictions.between(String propertyName,Object lo,Object hi) | 大于等于值1 并且小于等于值2 |
| not between 值1 and 值2 | Criterion Restrictions.not(Restrictions.between()) | 小于值1 或者大于值2 |
lists.add("bj");
Criterion criterion=Restrictions.in("empCtity", lists);
解析:empCtity为bj的员工
//1.4查询地址为bj的员工信息
@Test
public void hastable(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Emp.class);
List<String> lists=new ArrayList<String>();
lists.add("bj");
Criterion criterion=Restrictions.in("empCtity", lists);
criteria.add(criterion);
List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
} }
3)字符串模式匹配
Criterion criterion = Restrictions.ilike("empCtity", "%b%");
解析:Restrictions.ilike()字符串模型匹配同时忽略大小写(有i)
解析:Restrictions.like()字符串模型匹配
/**
* 1.5 字符串模式匹配
* 查询员工地址中包含“s”的所有员工,忽略大小写
Restrictions.ilike( ) //Ignore Like
*/
@Test
public void likeTest(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Emp.class); Criterion criterion = Restrictions.ilike("empCtity", "%b%"); criteria.add(criterion); List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
} }
4)逻辑运算符
解释有and逻辑与 or逻辑或 not逻辑非
Criterion criterion = Restrictions.and(c1, c2);
解析:将两个参数传入
/**
* 1.6 逻辑运算
* and 过滤 查找地址是bj 并且 名称中包含 “雨” 的员工信息
*/
@Test
public void logicTest(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Criteria criteria= session.createCriteria(Emp.class);
Criterion c1 = Restrictions.eq("empCtity", "bj");
Criterion c2= Restrictions.like("empName", "号",MatchMode.ANYWHERE); Criterion criterion = Restrictions.and(c1, c2); criteria.add(criterion); List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
}
5)集和运算
Criterion criterion = Restrictions.isEmpty("emps");
解析:Restrictions.isEmpty()集合为空,不包括任何元素
/**
* 1.7 集合运算
* 集合运算 查询 没有员工的部门
* */
@Test
public void collectionTest(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Dept.class);
//Restrictions类方法的返回值是Criterion
Criterion criterion = Restrictions.isEmpty("emps"); criteria.add(criterion); List<Dept> list = criteria.list();
for (Dept dept : list) {
System.out.println(dept.getDeptName());
}
}
(三)动态查询
解析:动态查询就是根据条件进行sql语句的拼接
/**
* 1.8 动态查询
* 如何查找出符合以下条件的员工信息:
职位是工程师,如:job = ‘engineer’
工资大于2000元,如:salary > 2000
入职时间在2006年12月31日至2008年12月31日之间
如何查找出符合以下条件的员工信息:
地址 = ‘bj’
员工编号大于0
*
* */
@Test
public void dynamicTest(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Emp.class);
//00.构建出一个和page对应的条件类,依次判定条件是否为空
EmpCondition condition=new EmpCondition();
condition.setEmpCity("bj");
condition.setEmpId(); //1.2判定之后,动态拼接检索条件
if (condition.getEmpCity()!=null) {
//用户填写了地址作为检索条件
criteria.add(Restrictions.eq("empCtity", condition.getEmpCity()));
}
if(condition.getEmpId()!=null){
//用户填写用户编号作为筛选条件
criteria.add(Restrictions.gt("empId", condition.getEmpId()));
}
List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
}
}
(四)Order排序
/**
* 1.9 排序 addOrder()
* 查询工号大于0的员工,查询结果按员工 编号升序排列
* */
@Test
public void orderTest(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Emp.class);
Criterion criterion = Restrictions.gt("empId", );
criteria.add(criterion).addOrder(Order.asc("empId"));
List<Emp> list = criteria.list(); for (Emp emp : list) {
System.out.println(emp.getEmpName());
} }
(五)分页
/**
* 1.10 分页
* Criteria接口提供了设置分页的方法
setFirstResult(int firstResult) 起始记录的索引
setMaxResult(int maxResult) 最大记录条数
//10.分页 查询员工表中的4-6条数据,每页3条数据
*/ @Test
public void pageListTest(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
Criteria criteria = session.createCriteria(Emp.class);
//总记录数 Projection projection = Projections.count("empId"); criteria.setProjection(projection); Integer count = ((Long)criteria.uniqueResult()).intValue();
System.out.println(count); //分页
int pageSize=;
int pageIndex=;
criteria.setFirstResult((pageIndex-)*pageSize);
criteria.setMaxResults(pageSize);
List<Emp> list = criteria.list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
} }
(六)DetachedCriteria
/**
* 1.11 DetachedCriteria和Criteria功能类似,它实现了CriteriaSpecification接口
Criteria是由Session对象创建的
DetachedCriteria创建时不需要Session对象
使用DetachedCriteria来构造查询条件
可以把DetachedCriteria作为方法参数传递给业务层
* 查询开发部的员工
* */
@Test
public void detachedCriteriaTest(){
Session session = HibernateUtil.currentSession();
Transaction tx = session.beginTransaction();
//构建一个DetachedCriteria对象
DetachedCriteria detachedCriteria=DetachedCriteria.forClass(Emp.class);
//别名
detachedCriteria.createAlias("dept","d");
//检索条件
Criterion criterion = Restrictions.eq("d.deptName", "开发部");
//绑定
detachedCriteria.add(criterion);
List<Emp> list = detachedCriteria.getExecutableCriteria(session).list();
for (Emp emp : list) {
System.out.println(emp.getEmpName());
} }
就此讲解到此,希望程序员的我们有收获!!!!友情提示HibernateUtil工具类
package cn.happy.until; import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; /**
* 工具类
* @author happy
*
*/
public class HibernateUtil {
//getCurrentSession()底层实现原理
//ThreadLocal变量
public static final ThreadLocal<Session> threadTL=new ThreadLocal<Session>(); //我想直接调用一个方法,获取Session
//定义一个sessionFactory对象
private static SessionFactory factory;
private static Configuration cfg;
static{
cfg=new Configuration().configure();
factory=cfg.buildSessionFactory();
}
//提供一个静态方法
public static Session currentSession(){
Session session=threadTL.get();
if(session==null){ //当前线程中没有session对象
session=factory.openSession();
threadTL.set(session);
}
return session; }
//关闭session
public static void closeSession(){
//获取线程中的session
Session session = threadTL.get();
if (session!=null) {
threadTL.set(null);
session.close();
}
} }
Criteria查询初学者的采纳点哦的更多相关文章
- Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)
写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...
- Hibernate框架Criteria查询
本文章适合一些初学者 一.使用Criteria查询数据 1.条件查询 1.1:使用Criteria查询的步骤 1.使用Sess ...
- NHibernate系列文章二十三:NHibernate查询之Criteria查询(附程序下载)
摘要 上一篇文章介绍了NHibernate HQL,他的缺点是不能够在编译时发现问题.如果数据库表结构有改动引起了实体关系映射的类有改动,要同时修改这些HQL字符串.这篇文章介绍NHibernate面 ...
- Criteria查询之sqlRestriction()的理解
sqlRestriction()的理解 在Criteria查询中 使用sqlRestriction()方法来提供SQL语法作限定查询,作为where字句 查看官方给的例子,如下 List cats = ...
- Criteria查询数据
Criteria介绍: Criteria查询是Hibernate提供的一种查询方式,与HQL基于字符串的查询形式完全不同.Hibernate提供了org.hiberanee.Criteria 接口.o ...
- Hibernate框架之Criteria查询
首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ...
- Hibernate 、Hql查询和Criteria查询
HQL查询: public Object query(String name){ Session s=null; try{ s=HibernateSessionFactory.getSession() ...
- 第九章 Criteria查询及注解
第九章 Criteria查询及注解9.1 使用Criteria查询数据 9.1.1 条件查询 Criteria查询步骤: 1)使用session接口的cr ...
- hibernate框架学习笔记7:HQL查询、Criteria查询简介
HQL查询:hibernate独有的查询语言 适用于不复杂的多表查询 示例: 实体类: package domain; public class Customer { private Long cus ...
随机推荐
- 每天一个linux命令(43):killall命令
Linux系统中的killall命令用于杀死指定名字的进程(kill processes by name).我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在 ...
- Mybatis中SqlMapper配置的扩展与应用(3)
隔了两周,首先回顾一下,在Mybatis中的SqlMapper配置文件中引入的几个扩展机制: 1.引入SQL配置函数,简化配置.屏蔽DB底层差异性 2.引入自定义命名空间,允许自定义语句级元素.脚本级 ...
- 信息加密之非对称加密算法RSA
前面为大家已经总结了,基于密钥交换的DH算法,现在就为大家再介绍一种基于因子分解的RSA算法,这种加密算法有两种实现形式:1.公钥加密,私钥解密:2.私钥加密,公钥解密.下面就为大家分析一下实现代码, ...
- codeforces Gargari and Permutations(DAG+BFS)
/* 题意:求出多个全排列的lcs! 思路:因为是全排列,所以每一行的每一个数字都不会重复,所以如果有每一个全排列的数字 i 都在数字 j的前面,那么i, j建立一条有向边! 最后用bfs遍历整个图, ...
- POJ 2312Battle City(BFS-priority_queue 或者是建图spfa)
/* bfs搜索!要注意的是点与点的权值是不一样的哦! 空地到空地的步数是1, 空地到墙的步数是2(轰一炮+移过去) 所以用到优先队列进行对当前节点步数的更新! */ #include<iost ...
- Java多线程系列--“JUC线程池”04之 线程池原理(三)
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html 本章介绍线程池的生命周期.在"Java多线程系列--“基础篇”01之 基 ...
- C语言中两位ASCII码可以表示汉字
最近偶然有人问到这个相关字符编码的问题,所以百度了下参考了这两个资料,进行了简单分析. ******************************************************** ...
- Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编
Linux C++ 调试神技--如何将Linux C++ 可执行文件逆向工程到Intel格式汇编 对于许多在windows 上调试代码的人而言, Intel IA32格式的汇编代码可能并不陌生,因为种 ...
- 基于HTML5的WebGL电信网管3D机房监控应用
先上段视频,不是在玩游戏哦,是规规矩矩的电信网管企业应用,嗯,全键盘的漫游3D机房: http://www.hightopo.com/guide/guide/core/3d/examples/exam ...
- 关于Entity Framework自动关联查询与自动关联更新导航属性对应的实体注意事项说明
一.首先了解下Entity Framework 自动关联查询: Entity Framework 自动关联查询,有三种方法:Lazy Loading(延迟加载),Eager Loading(预先加载) ...