[TOC]

# QBC(query by criteria)

QBC(query by criteria),它是一种更加面向对象的检索方式。

org.hibernate.criterion.Criterion是Hibernate提供的一个面向对象查询条件接口.一个单独查询就是Criterion接口的一个实例,用于限制Criteria对象的查询,在Hibernate中Criterion对象的创建通常是通过Restrictions工厂类完成的

具体如下:

1. 获得 Hibernate的 Session对象。

2. 通过 Session获得 Criteria对象。

3. 使用 Restrictions的静态方法创建 Criterion条件对象。 Restrictions类中提供了一系列用于

设定查询条件的静态方法,这些静态方法都返回 Criterion实例,每个 Criterion实例代表

个查询条件。

4. 向 Criteria对象中添加 Criterion查询条件。 Criteria的add()方法用于加入查询条件

5. 执行 Criteria的list()或uniqueresult()获得结果

Criteria接口与Query接口非常类似,允许创建并执行面向对象的标准化查询。值得注意的是Criteria接口也是轻量级的,它不能在Session之外使用。

## 基本检索

~~~

//1. 得到一个Criteria对象

Criteria criteria = session.createCriteria(Goods.class);

//2. 调用list方法

List list = criteria.list();

System.out.println(list);

~~~

## 排序检索

**注意在criteri.addOrder()方法的参数使用的Order是hibernate中的对象**

~~~

//得到一个Criteria对象

Criteria criteria = session.createCriteria(Goods.class);

//指定排序

criteria.addOrder(org.hibernate.criterion.Order.asc("money")); //asc升序, desc降序

//调用list方法

List list = criteria.list();

System.out.println(list);

~~~

## 条件检索

~~~

hql语句中,不能出现任何数据库相关的信息

> gt

>= ge

< lt

<= le

== eq

!= ne

in in

between and between

like like

is not null isNotNull

is null isNull

or or

and and

~~~

~~~

//查询名称叫 手机的 商品

Criteria criteria = session.createCriteria(Goods.class);

//其他条件 lt , le <=, ge >=, eq ==

Criterion like = Restrictions.like("name", "手机_");

//添加条件

criteria.add(like);

Goods c = (Goods) criteria.uniqueResult();

System.out.println(c);

//查询价格在1050以上,并且名称叫 手机的 商品

Criteria cri = session.createCriteria(Goods.class);

// >1050

SimpleExpression lt = Restrictions.gt("money", 1050d);

SimpleExpression eq = Restrictions.eq("c", c);

LogicalExpression and = Restrictions.and(lt, eq);

cri.add(and);

//List list = cri.add(Restrictions.and(

// Restrictions.gt("money", 1050d),

// Restrictions.eq("c", c)

//)).list();

~~~

## 分页检索

~~~

Criteria criteria = session.createCriteria(Goods.class);

criteria.setFirstResult((2 - 1) * 6);

criteria.setMaxResults(6);

List list = criteria.list();

System.out.println(list);

~~~

## 统计分组检索

`Count sum avg max min`

~~~

//1. 统计订单总数

Criteria criteria = session.createCriteria(Goods.class);

//Object obj = criteria.setProjection(Projections.rowCount()).uniqueResult();

//统计总行数 count(id)

//System.out.println(obj);

//2. 订单的总价格---分组统计根据客户

//criteria.setProjection(Projections.sum("money")); //统计总金额

criteria.setProjection(

Projections.projectionList().add(

Projections.sum("money"))

.add(Projections.groupProperty("c")

)

);

//这个集合保存的是Object[money的统计信息,客户信息]

List list = criteria.list();

~~~

## 离线条件检索

在多条件查询的时候,需要在Web层封装相应的参数到Criteria,

而在Dao层才真正的去执行查询数据库的操作,

所以需要在Web层创建Criteria并将其传递到Dao层,

这个时候就不能在Web层使用session.createCriteria来创建Criteria,

因为Criteria的一般创建都是使用session.createCriteria(),

而session都是在Dao层才会创建的

~~~

//1. 得到DetachedCriteria

DetachedCriteria dc = DetachedCriteria.forClass(Goods.class);

dc.add(Restrictions.like("name", "手机_"));

//2. 生成Criteria执行操作

Session session = HibernateUtils.openSession();

Criteria criteria = dc.getExecutableCriteria(session);

List list = criteria.list();

System.out.println(list);

~~~

java中使用QBC的好处_Criteria(QBC)相关推荐

  1. Java中引入泛型的好处

    泛型的本质是参数化类型,即所操作的数据类型被指定为一个参数.这种类型参数可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口.泛型方法. 在没有泛型的情况下,通过对类型Object的引用来实现参数 ...

  2. java中的枚举_Java中的枚举

    java中的枚举 Enum was introduced in Java 1.5 as a new type whose fields consists of a fixed set of const ...

  3. java中的规范是什么意思_Java中的异常规范有什么好处?

    我从C来到Java. 在Java和C中,我们都可以指定异常.看起来像这样: void function_name() throw(Exception) { ... if (error) { throw ...

  4. java final 变量 好处_深入理解Java中的final关键字

    Java中的final关键字非常重要,它可以应用于类.方法以及变量.这篇文章中我将带你看看什么是final关键字?将变量,方法和类声明为final代表了什么?使用final的好处是什么?最后也有一些使 ...

  5. java如果把字符串转成对象_为什么Java中的字符串对象是不可变的,有什么好处?...

    专注于Java领域优质技术号,欢迎关注 原创: 阿杜的世界 阅读本文大概需要 4分钟. 所谓不可变对象,是指一个对象在创建后,它的内部状态不会被改变的对象.这意味着当我们将一个不可变对象的引用赋值给某 ...

  6. Java中JVM的xmx和xms配置成一样的好处

    Java中JVM的-Xmx和-Xms配置成一样有什么好处 文章目录 Java中JVM的-Xmx和-Xms配置成一样有什么好处 一.`-Xmx`和`-Xms` 二.设置`-Xmx` 的注意点 三.-Xm ...

  7. java中封装的好处_编程中封装的作用/优点

    最近学习了Java三大特性中的封装,所以在这里总结一下自己堆封装的理解和简介,给大家做出参考. 什么是封装(Encapsulation): 封装(Encapsulation)是面向对象方法的重要原则, ...

  8. [转]JAVA中Action层, Service层 ,modle层 和 Dao层的功能区分

    首先这是现在最基本的分层方式,结合了SSH架构.modle层就是对应的数据库表的实体类.Dao层是使用了Hibernate连接数据库.操作数据库(增删改查).Service层:引用对应的Dao数据库操 ...

  9. Java中数据存储方式

    2019独角兽企业重金招聘Python工程师标准>>> 1. 寄存器(register).这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限, ...

最新文章

  1. c的按位取反运算符(~) 与逻辑逻辑(!)
  2. Response 输出文件流过程中的等待效果
  3. 网站停办了 服务器有备份吗,网站在服务器上四种备份方法
  4. live meeting中白板无法正常使用
  5. mvn如何编译源码命令_java – 如何使用maven编译单个文件?
  6. form表单上传文件
  7. mysql cmake ncursor_在移植的过程中主要会用到boost库、cmake工具以及wt库的编译。...
  8. Python数据分析pandas入门练习题(七)
  9. 前端自检梳理——Vue.js项目实战开发
  10. (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  11. python tkinter画福字
  12. Mac 安装minikube Error: No available formula with the name “minikube“
  13. 《笔记——机器学习与物理模型》by鄂维南院士讲座
  14. 百度朱光:将技术基因注入百度金融,是我们未来三五年要做的事
  15. Edge导航网址变成了毒霸的,如何改动?
  16. 量产技术-把kingston U盘做成USB-CDROM启动盘
  17. vue用路由守卫进行登录后的路由跳转
  18. SARscape下雷达图像一般处理与应用
  19. keras入门实例:非线性拟合求拟合系数
  20. 3D模型欣赏:超写实的性感金发美女3D角色 整体动作造型塑造自然协调【3D游戏建模教程】

热门文章

  1. MSYQL ORDER BY按拼音首字母排序
  2. NetBSD时间设置
  3. JAVA数组概念与C语言数组概念区别
  4. 手把手教你用python发送邮件
  5. 小妹安慰失恋大哥的爆笑过程(ZT)
  6. android签名原理
  7. SAP770系统FI模块配置(向一个会计年度变式分配公司代码)
  8. ApacheCN 翻译活动进度公告 2019.2.25
  9. ORA-00911错误及解决方法
  10. 常见的加密算法有哪些