三套查询之Criteria查询

完全面向对象的,不需要写任可查询语句.

1.查询所有的学生

  1. //1.查询所有的学生
  2. @Test
  3. public void test1(){
  4. Criteria criteria = session.createCriteria(Student.class);
  5. List<Student> list = criteria.list();
  6. for (Student student : list) {
  7. System.out.println(student.getId()+student.getName());
  8. }
  9.  
  10. Criteria criteria2 = session.createCriteria("com.rong.entity.group.Student");
  11. List<Student> list2 = criteria2.list();
  12. for (Student student : list2) {
  13. System.out.println(student.getId()+student.getName());
  14. }
  15. }

2.添加查询条件

add(Criterion criterion) : 添加查询条件.
Criterion : 代表一个查询条件.
Restrictions工具类,专门负责生成查询条件对象,它把where部分都改成了静态方法。
sqlRestriction(String sql) : 生成查询条件的万能方法.
Property工具类,专门负责生成查询条件对象.
Propery.forName("属性名").xxx()

  1. //2.添加查询条件
  2. @Test
  3. public void test2(){
  4. //1.添加一个
  5. Criteria criteria = session.createCriteria(Student.class);
  6. criteria=criteria.add(Restrictions.like("name", "%ab%"));
  7. List<Student> list = criteria.list();
  8. for (Student student : list) {
  9. System.out.println(student.getId()+student.getName());
  10. }
  11. //2.添加多个
  12. Criteria criteria2 = session.createCriteria(Student.class);
  13. criteria2.add(Restrictions.like("name", "%a%"));
  14. criteria2.add(Restrictions.between("java", 60, 100));
  15. List<Student> list2 = criteria2.list();
  16. for (Student student : list2) {
  17. System.out.println(student.getId()+student.getName());
  18. }
  19. System.out.println("===================================");
  20. Criteria criteria3 = session.createCriteria(Student.class);
  21. criteria3.add(Property.forName("name").like("%p%"));
  22. criteria3.add(Property.forName("math").between(85, 100));
  23. List<Student> list3 = criteria3.list();
  24. for (Student student : list3) {
  25. System.out.println(student.getId()+student.getName()
  26. +student.getMath());
  27. }
  28. }

3.添加自己的sql

  1. //3.添加自己的sql
  2. @Test
  3. public void test3(){
  4. Criteria criteria = session.createCriteria(Student.class);
  5. criteria.add(Restrictions.sqlRestriction("length(name)>4 and name like '%a%'"));
  6. List<Student> list = criteria.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName());
  9. }
  10. }

4.排序

addOrder(Order order) : 添加排序.
Order.asc("属性名") | Order.desc("属性名")
Property.forName("age").asc()|Property.forName("age").desc()

  1. //4.排序
  2. @Test
  3. public void test4(){
  4. //第一种方式
  5. Criteria criteria = session.createCriteria(Student.class);
  6. criteria.add(Restrictions.lt("id", 10));
  7. criteria.addOrder(Order.asc("java"));//升序
  8. List<Student> list = criteria.list();
  9. for (Student student : list) {
  10. System.out.println(student.getId()+student.getName()+student.getJava());
  11. }
  12. Criteria criteria2 = session.createCriteria(Student.class);
  13. criteria2.add(Restrictions.gt("id", 90));
  14. criteria2.addOrder(Order.desc("math"));//降序
  15. List<Student> list2 = criteria2.list();
  16. for (Student student : list2) {
  17. System.out.println(student.getId()+student.getName()+student.getMath());
  18. }
  19. //第二种方式
  20. Criteria criteria3 = session.createCriteria(Student.class);
  21. List<Student> list3 = criteria3.addOrder(Property.forName("java").asc()).list();
  22. for (Student student : list3) {
  23. System.out.println(student.getId()+student.getName()+student.getJava());
  24. }
  25. Criteria criteria4 = session.createCriteria(Student.class);
  26. List<Student> list4 = criteria4.addOrder(Property.forName("java").desc()).list();
  27. for (Student student : list4) {
  28. System.out.println(student.getId()+student.getName()+student.getJava());
  29. }
  30. }

5.查询一列

setProjection(Projection projection): 查询哪些列.
Projection : 代表一列
ProjectionList : 代表多列
Projections : 专门创建Projection | ProjectionList

  1. //5.查询一列
  2. @Test
  3. public void test5(){
  4. Criteria criteria = session.createCriteria(Student.class);
  5. criteria.setProjection(Projections.property("name"));
  6. List<String> list = criteria.list();
  7. for (String string : list) {
  8. System.out.println(string);
  9. }
  10. }

6.查询多列

  1. //6.查询多列
  2. @Test
  3. public void test6(){
  4. Criteria criteria = session.createCriteria(Student.class);
  5. ProjectionList pl = Projections.projectionList();
  6. pl.add(Projections.property("java"));
  7. pl.add(Projections.property("math"));
  8. criteria.setProjection(pl);
  9. //criteria.setProjection(Projections.projectionList().add(Projections.property("java"))
  10. // .add(Projections.property("math")));
  11. List<Object[]> list = criteria.list();
  12. for (Object[] objects : list) {
  13. for (Object object : objects) {
  14. System.out.print(object+"\t");
  15. }
  16. System.out.println();
  17. }
  18. }

7.聚集函数

  1. //7.聚集函数
  2. @Test
  3. public void test7(){
  4. Criteria criteria = session.createCriteria(Student.class);
  5. criteria.setProjection(Projections.rowCount());
  6. criteria.add(Restrictions.between("id", 10, 20));
  7. Object rowCount = criteria.uniqueResult();
  8. System.out.println("id在10到20之间的数量为:"+rowCount);
  9. Criteria criteria2 = session.createCriteria(Student.class);
  10. criteria2.setProjection(Projections.sum("java"));
  11. criteria2.add(Property.forName("id").between(1, 3));
  12. Object sum = criteria2.uniqueResult();
  13. System.out.println("id为1到3的java成绩总和为:"+sum);
  14. }

8.分组

  1. //8.分组
  2. @Test
  3. public void test8(){
  4. Criteria criteria = session.createCriteria(Student.class);
  5. criteria.setProjection(Projections.projectionList().add(Projections.rowCount()).add(Projections.groupProperty("teacher.id")));
  6. List<Object[]> list = criteria.list();
  7. for (Object[] objects : list) {
  8. for (Object object : objects) {
  9. System.out.println(object);
  10. }
  11. }
  12. }

9.通过老师id查询学生(使用别名查询)

setFetchMode(String associationPath, FetchMode mode): 抓取连接(join fetch)
FetchMode: 抓取模式
FetchMode.JOIN FetchMode.EAGER 立即查询
FetchMode.SELECT FetchMode.LAZY 延迟查询

  1. //9.通过老师id查询学生(使用别名查询)
  2. @Test
  3. public void test9(){
  4. Criteria criteria = session.createCriteria(Student.class);
  5. criteria.add(Restrictions.eq("teacher.tid", 1));
  6. List<Student> list = criteria.list();
  7. for (Student student : list) {
  8. System.out.println(student.getName()+student.getTeacher().getTid());
  9. }
  10. System.out.println("=============以下是通过别名查询================");
  11. Criteria criteria2 = session.createCriteria(Student.class);
  12. criteria2.createAlias("teacher", "t");
  13. criteria2.add(Restrictions.eq("t.id", 1));
  14. List<Student> list2 = criteria2.list();
  15. for (Student student : list2) {
  16. System.out.println(student.getName()+student.getTeacher().getTid());
  17. }
  18. }
  1. //setFetchMode: 抓取延迟的属性
  2. Criteria criteria3 = session.createCriteria(Student.class);
  3. criteria3.setFetchMode("teacher", FetchMode.JOIN);
  4. List<Student> list3 = criteria3.list();
  5. /*for (Student student : list3) {
  6. System.out.println(student.getName()+student.getTeacher().getTid());
  7. }*/

10.离线查询

离线查询 DetachedCriteria.
DetachedCriteria :用它就可以定义一条查询语句. select * from stu_info.
用得时候需要与Session关联起来.
离线查询的主要作用就是为了做子查询. in 、not in(离线查询对象)

  1. //10.离线查询
  2. @Test
  3. public void test10(){
  4. DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Student.class);
  5. Criteria criteria = detachedCriteria.getExecutableCriteria(session);
  6. List<Student> list = criteria.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName());
  9. }
  10. }

11.子查询

  1. //11.子查询
  2. @Test
  3. public void test11(){
  4. Criteria criteria = session.createCriteria(Student.class);
  5. criteria.add(Restrictions.in("id", new Object[]{1,2,3}));
  6. List<Student> list = criteria.list();
  7. for (Student student : list) {
  8. System.out.println(student.getId()+student.getName());
  9. }
  10. System.out.println("==================================");
  11. //离线查询作为子查询的一部分
  12. DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Student.class);
  13. detachedCriteria.setProjection(Projections.property("id"));
  14. detachedCriteria.add(Restrictions.between("id", 60, 90));
  15. Criteria criteria2 = session.createCriteria(Student.class);
  16. criteria2.add(Property.forName("id").in(detachedCriteria));
  17. List<Student> list2 = criteria2.list();
  18. for (Student student : list2) {
  19. System.out.println(student.getId()+student.getName());
  20. }
  21. }

Hibernate(八)的更多相关文章

  1. hibernate(八) Hibernate检索策略(类级别,关联级别,批量检索)详解

    序言 很多看起来很难的东西其实并不难,关键是看自己是否花费了时间和精力去看,如果一个东西你能看得懂,同样的,别人也能看得懂,体现不出和别人的差距,所以当你觉得自己看了很多书或者学了很多东西的时候,你要 ...

  2. Hibernate(八)__级联操作、struts+hibernate+接口编程架构

    级联操作 所谓级联操作就是说,当你进行主对象某个操作时,从对象hibernate自动完成相应操作. 比如: Department <---->Student 对象关系,我希望当我删除一个d ...

  3. Hibernate(八)多对多映射

    一.创建数据表 --学生证表 create table paper ( pid number primary key, pdesc ) , sid number references student( ...

  4. Hibernate(八)--session的两种获取方式

    openSession getCurrentSession Hibernate有两种方式获得session,分别是: openSession和getCurrentSession他们的区别在于1. 获取 ...

  5. 八步详解Hibernate的搭建及使用

    本文通过了八个步骤以及一些实例添加用户来介绍Hibernate的搭建和使用,真切的介绍了hibernate的基本用法,其中好多优点等待我们自己去发现,比如hibernate中的缓存机制,映射方案. 1 ...

  6. (Hibernate进阶)Hibernate映射——多对多关联映射(八)

    多对多映射是现实生活中最常见的映射,也是最容易理解的映射.废话少说,直接开始. 映射原理 不论是单向关联还是双向关联都是通过第三张表,将两个表中的主键放到第三张做一个关联.用第三张表来解决可能会造成数 ...

  7. [Java面试八]Hibernate总结以及在面试中的一些问题.

    1.为什么要使用Hibernate开发你的项目呢?Hibernate的开发流程是怎么样的? 为什么要使用 ①.对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码. ②.Hiber ...

  8. hibernate(八)一对多关联

    一.一对多单向关良 一对多单向关联与多对一相似 假设一个组有多个用户,即一(Group)对多(User) 需要在Group类中添加一个User类的Set集合(数据库中的用户不可能是重复的,所以要用Se ...

  9. HIbernate的基本包——八个,详细条目

    antlr-2.7.6commons-collections-3.1dom4j-1.6.1hibernate3javassist-3.9.0.GAjta-1.1slf4j-api-1.5.8slf4j ...

  10. 攻城狮在路上(壹) Hibernate(十八)--- 管理Hibernate的缓存

    一般Session的缓存被称为Hibernate的第一级缓存,SessionFactory的外置缓存是一个可配置的缓存插件,称为Hibernate的第二级缓存.一.缓存的基本原理: 1.持久化层的缓存 ...

随机推荐

  1. git向码云上提交项目

    git向码云上提交项目 设置账号名字和邮箱 $ git config --global user.name "注册时账号的名字" $ git config --global use ...

  2. Jquery 批量操作标签属性

     $("[id*='Custom']").removeAttr("disabled")

  3. 第一节 如何用Go实现单链表

    一.概念介绍 下面这副图是我们单链表运煤车队. 每节运煤车就是单链表里的元素,每节车厢里的煤炭就是元素中保存的数据.前后车通过锁链相连,作为单链表运煤车,从1号车厢开始,每节车厢都知道后面拉着哪一节车 ...

  4. C#的Dispose模式复习

    http://www.cnblogs.com/DebugLZQ/archive/2012/08/28/2659189.html http://www.cnblogs.com/tsoukw/archiv ...

  5. 见到Unicode、GB2312、GBK 、ANSI、Ascii、DBCS、BIG5、UTF这一堆名词你是否犯晕?请看转载的好文

    作者:于洋链接:https://www.zhihu.com/question/23374078/answer/69732605来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

  6. python 多线程笔记(6)-- 闭包

    在类里弄一个闭包出来 很多资料上说,类内部的变量有两种. 按定义所在的位置,分__init__上方的和__init__下方的 按内存所在的位置,分类的和实例的,或者说公共的和私有的 现在,我想在类里定 ...

  7. underscore.js 分析 第三天

    // Create a safe reference to the Underscore object for use below. // 为Underscore对象创建一个安全的引用 // _为一个 ...

  8. Intellij IDEA 热部署插件Jrebel激活

    激活前请确保已经安装好了Jrebel插件,本文通过反向代理激活. 第一步:下载激活工具(即代理工具),下载地址:https://github.com/ilanyu/ReverseProxy/relea ...

  9. ython进阶06 循环对象

    这一讲的主要目的是为了大家在读Python程序的时候对循环对象有一个基本概念. 循环对象的并不是随着Python的诞生就存在的,但它的发展迅速,特别是Python 3x的时代,循环对象正在成为循环的标 ...

  10. 3.5星|《算法霸权》:AI、算法、大数据在美国的阴暗面

    算法霸权 作者在华尔街对冲基金德绍集团担任过金融工程师,后来去银行做过风险分析,再后来去做旅游网站的用户分析.后来辞职专门揭露美国社会生活背后的各种算法的阴暗面. 书中提到的算法的技术缺陷,我归纳为两 ...