首先给大家说说Hibernate检索方式

Hibernate提供了5种检索对象的方式

1.导航对象图检索方式:根据已经加载的对象导航到其他对象

2.OID检索方式:按照对象的OID来检索对象

3.HQL检索方式:使用面向对象的HQL查询语言

4.QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口

5.本地SQL检索方式:使用本地数据库的SQL查询语句

Criteria查询是Hibernate提供的另一种查询方式,与HQL基于字符串的查询形式完全不同。Hibernate提供了org.hibernate.Criteria接口,org.hibernate.criterion.Critereion接口和org.hibernate.criterion.Restrictions类等Criteria API,用于支持在运行时动态生成查询语句。

一:条件查询

使用Criteria查询包括以下步骤:

1.使用Session接口的createCriteria()方法创建Criteria对象

2.使用Restrictions类提供的静态方法设置查询条件,这些静态方法返回Criterion对象,一个Criterion对象代表一个查询条件。Criteria借口的add()方法用来添加查询条件。

3.使用Criteria接口的list()方法执行查询语句,list()方法返回java.util.List类型的结果,List集合中的每个元素都是持久化对象。

实例一:使用Criteria查询所有的部门

Session session;
Transaction tx; //单元测试前走
@Before
public void Before(){
session= HibernateUtil.currentSession();
tx= session.beginTransaction();
} //单元测试后走
@After
public void After(){
tx.commit();
HibernateUtil.closeSession();
} @SuppressWarnings("unchecked")
@Test //使用Criteria查询所有的部门名称
public void TestOne(){
Criteria criteria = session.createCriteria(Dept.class);
List<Dept> list = criteria.list();
for (Dept dept : list) {
System.out.println(dept.getDeptname());
}
}

实例二:查询部门表为"财务部2"的部门  --Restrictions.between()

public void TestThree(){
List<Dept> list=session.createCriteria(Dept.class).add(Restrictions.eq("deptname", "财务部2")).list();
for (Dept dept : list) {
System.out.println(dept.getDeptname());
}
}

实例三:查询部门表的deptname为"财务部2"和"财务部"的名称(链式编程风格)  --Restrictions.in()

@Test //查询Dept的deptname为财务部2和财务部的名称(链式编程风格)
public void TestFour(){
List jobList=new ArrayList<String>();//定义一个数组
jobList.add("财务部");
jobList.add("财务部2");
List<Dept> list=session.createCriteria(Dept.class).add(Restrictions.in("deptname", jobList)).list();
for (Dept dept : list) {
System.out.println(dept.getDeptname());
}
}

实例四:查询Empinfo表的ehomezipcode(薪资)在500到100000  --Restrictions.between()

    @Test //查询Empinfo的ehomezipcode在500到100000
public void TestFive(){
List<Empinfo> list=session.createCriteria(Empinfo.class).add(Restrictions.between("ehomezipcode", 500, 100000)).list();
for (Empinfo empinfo : list) {
System.out.println(empinfo.getEname());
}
}

实例五:查询部门表中名字有"总"子的员工 --like() ilike()

    @Test //查询Empinfo的ename在中有 总
public void TestSix(){
//like 字符串模式匹配
//ilike 字符串模式匹配 同时忽略大小写
List<Empinfo> list=session.createCriteria(Empinfo.class).add(Restrictions.like("ename", "%总%")).list();
for (Empinfo empinfo : list) {
System.out.println(empinfo.getEname());
}
}

MatchMode类的四种模式:

MatchMode.START:字符串在最前面的位置.相当于"like 'key%'"
MatchMode.END:字符串在最后面的位置.相当于"like '%key'"
MatchMode.ANYWHERE:字符串在中间匹配.相当于"like '%key%'"
MatchMode.EXACT:字符串精确匹配.相当于"like 'key'"

实例六:查询Empinfo的ename在中"张总"或"王总" --Restrictions.or()

    @Test //查询Empinfo的ename在中张总或王总
public void TestSeven(){
List<Empinfo> list=session.createCriteria(Empinfo.class).add(Restrictions.or(Restrictions.eq("ename", "张总"), Restrictions.eq("ename", "王总"))).list();
for (Empinfo empinfo : list) {
System.out.println(empinfo.getEname());
}
}

实例七:查询没有员工的部门  --Restrictions.isEmpty()

@Test //查询没有员工的部门
public void TestEight(){
List<Dept> list=session.createCriteria(Dept.class)
.add(Restrictions.isEmpty("emps"))
.list();
for (Dept dept : list) {
System.out.println(dept.getDeptname());
}
}

二:动态查询   --根据判断用户给的条件查询

实例一:Empinfo表中查询条件可为:

1.薪资大于8000

2.街道是"北京大街"

3.城市为"北京"

@Test
public void TestNice(){
Criteria criteria = session.createCriteria(Empinfo.class);
//00.构建出一个和page对应的条件类,依次判定条件是否为空
Empinfo empinfo=new Empinfo();
empinfo.setEhomecity("北京");
empinfo.setEhomestreet("北京大街");
empinfo.setEhomezipcode(8000); //1.2判定之后,动态拼接检索条件
if (empinfo.getEhomecity()!=null) {
//用户填写了城市作为检索条件
criteria.add(Restrictions.eq("ehomecity", empinfo.getEhomecity()));
}
if(empinfo.getEhomeprovince()!=null){
//用户填写薪资作为筛选条件
criteria.add(Restrictions.gt("ehomeprovince", empinfo.getEhomeprovince()));
}
if (empinfo.getEhomestreet()!=null) {
//用户填写街道作为筛选条件
criteria.add(Restrictions.eq("ehomestreet", empinfo.getEhomestreet()));
}
List<Empinfo> list = criteria.list();
for (Empinfo emp : list) {
System.out.println(emp.getEname());
} }

三:排序查询

HQL使用order by 字句对查询结果排序,Criteria查询使用org.hibernate.criterion.Order类对查询结果排序

升序:addOrder(Order.asc())

降序:addOrder(Order.desc())

实例一:查询Empinfo表按工资升序  --addOrder(Order.asc())

@Test
// 查询Empinfo按工资升序
public void TestOne() {
List<Empinfo> list = session.createCriteria(Empinfo.class)
.addOrder(Order.asc("ehomezipcode")).list();
for (Empinfo empinfo : list) {
System.out.println(empinfo.getEhomezipcode());
}
}

四:分页查询

Criteria接口提供了设置分页的方法

setFirstResult(int firstResult):设置从哪一个对象开始查询,参数firstResult是个对象在查询结果中的位置,位置的起始值是0

setMaxResult(int maxResult):设置一次最多查询出的对象个数

实例一:分页查询按工资升序后的Empinfo表

    @Test
// 分页查询Empinfo表
public void TestTwo() {
List<Empinfo> list = session.createCriteria(Empinfo.class)
.addOrder(Order.asc("ehomezipcode"))
.setFirstResult(0)
.setMaxResults(2).list();
for (Empinfo empinfo : list) {
System.out.println(empinfo.getEhomezipcode());
}
}

五:DetachedCriteria

DetachedCriteria和Criteria功能类似,它实现了CriteriaSpecification接口
Criteria是由Session对象创建的
DetachedCriteria创建时不需要Session对象
使用DetachedCriteria来构造查询条件
可以把DetachedCriteria作为方法参数传递给业务层

实例一:查询财务部的员工

@SuppressWarnings("unchecked")
@Test
public void TestSenven() {
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Emp.class,"e")
.createAlias("e.dept", "d")
.add(Restrictions.eq("d.deptname", "财务部"));
List<Emp> list = detachedCriteria.getExecutableCriteria(session).list();
for (Emp emp : list) {
System.out.println(emp.getEmpname());
} }

六:查询唯一对象  --uniqueResult()

uniqueResult()方法用于查询唯一对象。需要注意,必须明确知道查询结果中只有一个对象,才可以直接使用uniqueResult()方法。

实例一:查询Emp表总记录数

@Test
// 查询Emp表总记录数
public void TestThree2() {
Integer result =(Integer) session.createCriteria(Emp.class)
.setProjection(Projections.count("empno")).uniqueResult();
System.out.println(result);
}

七:连接查询

1.内连接

01.使用createCriteria()

实例一:查询财务部的姓名中包括“总”的员工

@Test
// 查询财务部的姓名中包括“总”的员工
public void TestFour() {
List<Emp> list = session.createCriteria(Emp.class)
.add(Restrictions.ilike("empname", "总", MatchMode.ANYWHERE))
.createCriteria("dept")
.add(Restrictions.eq("deptname", "财务部").ignoreCase()).list();
for (Emp emp : list) {
System.out.println(emp.getEmpname());
} }

02.使用createAlias()

实例一:查询财务部的姓名中包括“总”的员工

@Test
// 查询财务部的姓名中包括“总”的员工
public void TestFive() { List<Emp> list = session.createCriteria(Emp.class, "e")
.createAlias("dept", "d")
.add(Restrictions.ilike("e.empname", "总", MatchMode.ANYWHERE))
.add(Restrictions.eq("d.deptname", "财务部").ignoreCase()).list();
for (Emp emp : list) {
System.out.println(emp.getEmpname());
} }

2.迫切左连接  --setFetchMode()

实例一:查询部门为“财务部”的员工个数

@Test
// 查询部门为“财务部”的员工个数
public void TestSix() {
List<Dept> list = session.createCriteria(Dept.class, "d")
.setFetchMode("emps", FetchMode.JOIN)
.add(Restrictions.eq("deptname", "财务部"))
.list();
//使用Set接口的实现类HashSet来过滤重复的数据(HashSet中不会存储相同的值)
HashSet<Dept> set=new HashSet<Dept>(list);
for (Dept dept : set) {
System.out.println(dept.getDeptname()+","+dept.getEmps().size());
}
}

Hibernate框架之Criteria查询的更多相关文章

  1. Hibernate框架之Criteria查询 和注解(重点☆☆☆☆☆,难点☆☆☆)

    写好一篇博客,不是容易的事.原因是:你要给自己以后看的时候,还能看懂,最重要的是当别人看到你的博客文章的时候,也一样很清楚的明白你自己写的东西.其实这也是一种成就感!! 对于每一个知识点,要有必要的解 ...

  2. Hibernate-ORM:15.Hibernate中的Criteria查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲师Hibernate中的Criteria查询! 一,Criteria简介: 刚接触Hibernate ...

  3. Hibernate框架之Criteria 详解

    自从学数据库以来,从SQL查询-HQL查询-到Criteria 查询.有人问我:掌握一种查询语句不就可以吗,为什么还要学Criteria 查询?我回答道:用到特定于数据库的SQL 语句,程序本身会依赖 ...

  4. Hibernate框架之HQL查询与Criteria 查询的区别

    Hibernate框架提供了HQL查询和Criteria 查询.下面对这两种查询分别做个例子.也好对这两种查询方法有个大概的了解.就用房屋信息表做例子,查询所有房屋信息. HQL语句查询所有房屋信息: ...

  5. Hibernate框架中Criteria语句

    在Hibernate中有一种查询语句是Criteria查询(QBC查询),今天呢 我们就一个个的详细的跟大家一起探讨Criteria语句的相关知识点 案例前的准备 //插入测试数据,构建数据库 pub ...

  6. Hibernate框架笔记04HQL_QBC查询详解_抓取策略优化机制

    目录 1. Hibernate的查询方式 1.1 方式一:OID查询 1.2 方式二:对象导航查询 1.3 方式三:HQL方式 1.4 方式四:QBC查询 1.5 方式五:SQL查询 2. 环境搭建 ...

  7. Hibernate(十二)Criteria查询

    一.简述 Criteria是一种比hql更面向对象的查询方式.Criteria 可使用 Criterion 和 Projection 设置查询条件.可以设置 FetchMode(联合查询抓取的模式 ) ...

  8. Hibernate中使用Criteria查询

    忽略一些配置,测试代码如下: Session session= HibernateUtil.getSession(); Transaction tx= session.beginTransaction ...

  9. Hibernate框架学习(八)——查询-HQL语法

    一.单表查询 1.基础语法 2.排序 3.条件 4.分页 5.聚合 6.投影 二.多表查询 1.回顾原生SQL 1>交叉连接-笛卡尔积(避免)select * from A,B; 2>内连 ...

随机推荐

  1. windows server 2003 ODBC数据源配置错误

    1.ODBC 数据源链接失败,错误 :STATE hy000, 不能产生SSPI上下文, 2.文件服务器,TCP/IP协议属性中,DNS没有填写,填入DNS即可解决.

  2. spotify engineering culture part 1

    原文 ,因为原视频说的太快太长, 又没有字幕,于是借助youtube,把原文听&打出来了. 中文版日后有时间再翻译. one of the big succeess factors here ...

  3. (笔记)Linux内核学习(六)之并发和同步概念

    一 临界区和竞争条件 临界区:访问和操作共享数据的代码段. 竞争条件:多个执行线程处于同一个临界区中. 处于竞争条件:造成访问的数据或者资源不一致状态: 对资源i的访问:ProcessA和B访问后得到 ...

  4. 在Windows2008系统中利用IIS建立FTP服务器

    一.服务器管理器   1.2008的系统使用服务器管理器,选择角色,因为我之前已经开启了IIS服务器角色,所以我现在只要添加角色服务即可,如果你没有开启过的话,直接添加角色即可.   2.选择WEB服 ...

  5. ORA-00119: invalid specification for system parameter LOCAL_LISTENER - 转

    错误分析 listener 可以正常启动: [oracle@o_target admin]$ cat listener.ora# listener.ora Network Configuration ...

  6. C# 开发者代码审查清单【转】

    这是为C#开发者准备的通用性代码审查清单,可以当做开发过程中的参考.这是为了确保在编码过程中,大部分通用编码指导原则都能注意到.对于新手和缺乏经验(0到3年工作经验)的开发者,参考这份清单编码会很帮助 ...

  7. CocoStudio教程三:认识并利用CocoStudio的果实 运行2.2.1版本

    原文:CocoStudio教程三:认识并利用CocoStudio的果实 原文用的老版,用2.21搞起来好像有些问题,然后自己摸索了下,有的都是乱找的方法,只求能运行... 1,原文的CCJsonRea ...

  8. [转]make: 警告:检测到时钟错误。您的创建可能是不完整的。

    转自http://blog.csdn.net/maopig/article/details/6599660 我在make的时候也出现了同样的问题,不过不是什么大问题,这个不影响编译结果 分析原因可能是 ...

  9. java面试欠缺知识点总结

    针对最近面试被问到的问题,总结自己欠缺的知识点,并要在接下来的1年内加强这些知识: Java方面:反射.线程concurrent包: Spring方面:Ioc和Aop.事务: 持久化框架:设计并实现分 ...

  10. MVC3.0学习笔记之元模型元数据ModelMetaData以及模型元数据提供系统

    模型元数据ModelMetaData是MVC中很重要的概念,它包括但不仅限于 模型的类型,模型包含了哪些属性,属性都是什么类型的,属性上都有什么特性. ASP.NET MVC3.0 提供了默认的模型元 ...