一、简述

Criteria是一种比hql更面向对象的查询方式。Criteria 可使用 Criterion 和 Projection 设置查询条件。可以设置 FetchMode(联合查询抓取的模式 ) ,设置排序方式,Criteria 还可以设置 FlushModel (冲刷 Session 的方式)和 LockMode (数据库锁模式)。

Criteria本身只是查询的容器。Criteria查询又称对象查询

Criteria查询采用面向对象的方式封装查询条件。由Hibernater自动生成SQL查询语句

二、不带查询条件

建立数据表

create table login
(
username varchar2(32) primary key,
password varchar2(32) not null ,
age number(3)
); insert into login
select '张三','',21 from dual union
select 'Tom','',34 from dual union
select 'Jack','',34 from dual union
select '李四','qwerty',23 from dual;
commit;

建立持久化类和配置文件

Hibernate.cfg.xml配置文件

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration> <session-factory>
<property name="dialect">
org.hibernate.dialect.Oracle9Dialect
</property>
<property name="connection.url">
jdbc:oracle:thin:@localhost:1521:orcl
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<property name="connection.driver_class">
oracle.jdbc.OracleDriver
</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property> <mapping resource="entity/Login.hbm.xml" /> </session-factory> </hibernate-configuration>

持久化类和配置文件

package entity;

public class Login implements java.io.Serializable {

    // Fields

    /**
*
*/
private static final long serialVersionUID = 1L;
private String username;
private String password;
private int age; // Constructors /** default constructor */
public Login() {
} /** minimal constructor */
public Login(String username, String password) {
this.username = username;
this.password = password;
} /** full constructor */
public Login(String username, String password, int age) {
this.username = username;
this.password = password;
this.age = age;
} // Property accessors public String getUsername() {
return this.username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return this.password;
} public void setPassword(String password) {
this.password = password;
} public int getAge() {
return this.age;
} public void setAge(int age) {
this.age = age;
} }

配置文件Login.hbm.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <hibernate-mapping>
<class name="entity.Login" table="LOGIN" schema="ROOT">
<id name="username" type="java.lang.String">
<column name="USERNAME" length="32" />
<generator class="assigned" />
</id>
<property name="password" type="java.lang.String">
<column name="PASSWORD" length="32" not-null="true" />
</property>
<property name="age" type="java.lang.Integer">
<column name="AGE" precision="3" scale="0" />
</property>
</class>
</hibernate-mapping>

测试类:

package demo;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import entity.Login; public class Demo1 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//查询使用list方法
result=criteria.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }

结果:

Hibernate:
select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
用户名:Jack 密码:12345678 年龄:34
用户名:Tom 密码:123123 年龄:34
用户名:李四 密码:qwerty 年龄:23
用户名:张三 密码:123456 年龄:21

三、添加查询条件

3.1、加入一个username的条件

    //声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//添加查询条件 Restrictions.eq是等于的意思,2个参数,第一个为持久化类的属性,第2个为比较的参数值 criteria.add(Restrictions.eq("username", "Tom"));
//查询使用list方法
result=criteria.list();

执行的SQL

    select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
this_.USERNAME=?

3.2、多个查询条件AND--between

//年龄在大于等于25
criteria.add(Restrictions.le("age", 25));
//年龄小于等于23
criteria.add(Restrictions.ge("age", 23));

或者

//年年龄大于23小于25之间的记录
criteria.add(Restrictions.between("age", 23, 25));

执行的SQL

 select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
this_.AGE<=?
and this_.AGE>=?
select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
this_.AGE between ? and ?

3.3、多个查询条件或者条件 or

criteria.add(Restrictions.or(Restrictions.eq("age", 23), Restrictions.like("username", "%李%")));
//或者以下写法直接使用SQL语句
criteria.add(Restrictions.sqlRestriction("age=20 or username like '%李%'"));

执行SQL

 select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
(
this_.AGE=?
or this_.USERNAME like ?
)

直接使用SQL的执行语句

 select
this_.USERNAME as USERNAME0_0_,
this_.PASSWORD as PASSWORD0_0_,
this_.AGE as AGE0_0_
from
ROOT.LOGIN this_
where
age=20
or username like '%李%'

四、Restrictions常用方法

五、常用方法使用

package demo;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Restrictions; import entity.Login; public class Demo1 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//1.查询用户名为Tom的记录
//criteria.add(Restrictions.eq("username", "Tom"));
//2.查询年龄大于等于21同时小于等于25的记录
//criteria.add(Restrictions.ge("age", 21));
//criteria.add(Restrictions.le("age", 25));
//between写法
//criteria.add(Restrictions.between("age", 21, 25));
//3.或者查询年龄=21或者名字中有李的记录
//criteria.add(Restrictions.or(Restrictions.eq("age", 21), Restrictions.like("username", "%李%")));
//sql写法
//criteria.add(Restrictions.sqlRestriction("age=21 or username like '%李%'"));
//4.年龄在21,23,25的记录
//criteria.add(Restrictions.in("age", new Integer []{21,23,25}));
//5.and用法
criteria.add(Restrictions.and(Restrictions.ge("age", 23), Restrictions.like("username", "%T%"))); //查询使用list方法
result=criteria.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
System.out.println("==========");
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }

六、对结果进行排序

使用Order关键字,进行排序

criteria.addOrder(Order.desc(属性名称));降序

criteria.addOrder(Order.asc(属性名称));升序

//按年龄降序排序
criteria.addOrder(Order.desc("age"));
//按姓名升序排序
criteria.addOrder(Order.asc("username"));
//查询使用list方法
result=criteria.list();
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
}

七、示例查询

package demo;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions; import entity.Login; public class Demo2 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//声明一个Login对象,并赋值可以是多个 但不能是主键
Login user=new Login();
user.setAge(21); //初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//加入查询条件
criteria.add(Example.create(user)); //查询使用list方法
result=criteria.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
System.out.println("==========");
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }

八、聚合函数

package demo;

import java.util.Iterator;
import java.util.List; import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration; import org.hibernate.criterion.ProjectionList;
import org.hibernate.criterion.Projections; import entity.Login; public class Demo3 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null; //初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//加入查询条件
//总记录数
//criteria.setProjection(Projections.rowCount());
//平均年龄
//criteria.setProjection(Projections.avg("age"));
//分组
criteria.setProjection(Projections.groupProperty("username"));
//查询使用list方法
result=criteria.list();
//System.out.println("平均年龄:"+result.iterator().next());
//System.out.println("总记录数:"+result.iterator().next());
Iterator iterator=result.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
} } }

分页

package demo;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions; import entity.Login; public class Demo4 { /**
* Criteria无查询条件查询所有
*/
public static void main(String[] args) {
//声明一个集合用来接收结果
List<Login> result=null;
//声明SessionFactory
SessionFactory factory=null;
//声明Session
Session session=null;
//当前页数第几页
int pageIndex=1;
//最大显示记录数
int pageSize=2;
//初始化以上对象
try{
factory=new Configuration().configure().buildSessionFactory();
session=factory.openSession();
//声明Criteria对象传入一个持久化类对象类型
Criteria criteria=session.createCriteria(Login.class);
//起始记录数
criteria.setFirstResult((pageIndex-1)*pageSize);
//每页显示最大记录数
criteria.setMaxResults(pageSize); //查询使用list方法
result=criteria.list();
}catch(HibernateException e){
e.printStackTrace();
}finally{
session.close();
factory.close();
}
System.out.println("==========");
//输出结果
for (Login login : result) {
System.out.println("用户名:"+login.getUsername()+" 密码:"+login.getPassword()+" 年龄:"+login.getAge());
} } }

Hibernate(十二)Criteria查询的更多相关文章

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

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

  2. (十二)数据库查询处理之Query Execution(1)

    (十二)数据库查询处理之Query Execution(1) 1. 写在前面 这一大部分就是为了Lab3做准备的 每一个query plan都要实现一个next函数和一个init函数 对于next函数 ...

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

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

  4. Hibernate框架之Criteria查询

    首先给大家说说Hibernate检索方式 Hibernate提供了5种检索对象的方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQ ...

  5. Hibernate中使用Criteria查询

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

  6. 跟我一起读postgresql源码(十二)——Executor(查询执行模块之——Materialization节点(下))

    接前文,我们继续说剩下的4个Materialization节点. 7.SetOp节点 SetOp节点用于处理集合操作,对应于SQL语句中的EXCEPT.INTERSECT两种集合操作,至于另一种集合操 ...

  7. oracle学习笔记(十二) 查询练习(二) 高级查询

    高级查询练习 /*--------------------------------------------- 分组查询 -------------------------------------*/ ...

  8. Hibernate框架之Criteria 详解

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

  9. 50个SQL语句(MySQL版) 问题十二

    --------------------------表结构-------------------------- student(StuId,StuName,StuAge,StuSex) 学生表 tea ...

随机推荐

  1. PAT甲级1111. Online Map

    PAT甲级1111. Online Map 题意: 输入我们当前的位置和目的地,一个在线地图可以推荐几条路径.现在你的工作是向你的用户推荐两条路径:一条是最短的,另一条是最快的.确保任何请求存在路径. ...

  2. PCI DSS合规建设ASV扫描介绍

    最近查一些Nessus.Nexpose漏洞扫描工具相关资料,工具介绍都会提到一些审计功能,其中最常见的就是PCI DSS合规性审计.从网上找到一篇介绍较详尽的文章,与大家分享. 原文摘自:http:/ ...

  3. 重温JavaScript获取CSS样式的方法(兼容各浏览器)

    众所周知,CSS样式有三种类型:行内样式.内部样式和外部样式,JavaScript获取CSS样式时分为两种情况:行内样式获取法 和 非行内样式获取法 . 一.行内样式获取相对简单,通过element. ...

  4. mklink让网盘同步不同文件夹

    mklink简介 Linux 下有一个叫符号链接的东东,是 ln 这个链接命令,mklink 和 ln 的功能几乎一样.在xp系统下,junction命令要用微软开发的小程序 junction.exe ...

  5. 74HC125 74HCT125 74LV125 74LVC125

    74HC125; 74HCT125Quad buffer/line driver; 3-state The 74HC125; 74HCT125 is a quad buffer/line driver ...

  6. Image.Save()发生“GDI+ 中发生一般性错误”

    从数据库中读取的图片是byte[]类型,将其转换成Image可以正常显示,但是调用image.Save()时会发生“GDI+ 中发生一般性错误”.public static System.Drawin ...

  7. 报错: LINQ to Entities 不识别方法“Int32 Parse(System.String)

    断点调试发现报错的语句为: public ActionResult SomeMethod(string someId) { var temp = SomeService.LoadEntities(a ...

  8. ASP.NET MVC中的Session以及处理方式

    最近在ASP.NET MVC项目中碰到这样的情况:在一个controller中设置了Session,但在另一个controller的构造函数中无法获取该Session,会报"System.N ...

  9. 29防止程序集被篡改仿冒,全局程序集缓存GAC

      为什么需要强名称程序集和数字签名 有一个类库项目ClassLib,对应的程序集是ClassLib.dll.当前控制台项目引用ClassLib.dll程序集的方式有2种: 1.通过添加现有项目 文件 ...

  10. 用Redis实现分布式锁以及redission使用

    原文:https://my.oschina.net/wangnian/blog/668830 前言:分布式环境有很多问题,比如你前一个请求访问的是服务器A,第二个请求访问到了服务器B,就会发生并发重复 ...