博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate-Criteria
阅读量:5892 次
发布时间:2019-06-19

本文共 12317 字,大约阅读时间需要 41 分钟。

Hibernate Criteria简介

一、Criteria接口的用途:

  • 设计上可以灵活的根据criteria的特点进行查询条件的组装。

  • CriteriaSpecification 接口是 Criteria 接口和 DetachedCriteria 接口的父接口。

  • DetachedCriteria 接口和 Criteria 接口的主要区别在于:
    1. Criteria 是在线的,所以他由Hibernate Session进行创建;而DetachedCriteria 是离线的,创建时无需Session,他自己提供了两个静态方法:forClass(Class) 、forEntityName(Name),来进行实例的创建。
    2. Spring中提供了getHibernateTemplate().findByCriteria(DetachedCriteria)可以很方便的根据DetachedCriteria来返回查询结果。
  • Criteria接口特性:
    1. 他们均可以通过Criterion 和 Projection 来设置查询条件。可以设置 FetchModel(联合查询抓取的模式)来设置排序方式;对于Criteria可以设置FlushModel(冲刷Session的方式)和LockModel(数据库锁模式)。
    2. Criterion是Criteria的查询条件,Criteria提供了add(Criterion criterion)方法来添加查询条件。
    3. Criterion接口的主要实现类主要包括:Example、Junction、SimpleExpression。而Junction实际使用是他的两个子类Conjunction、Disjunctive,分别使用 AND 和 OR 操作符来链接查询条件集合。
    4. Criteria的实例可以通过Restrictions工具类累创建,Restrictions提供了大量的静态方法,eg:eq(等于)、ge(大于等于)、between等方法来创建Criterion 查询条件(SimpleExpression实例),除此之外,Restrictions还提供了Conjunction 和 Disjunction创建的方法,通过往该实例的add(Criteria criteria)方法来添加出巡条件,形成一个查询条件集合。
    5. Example的创建有所不同,Example本身提供了create(Object entity)静态方法,即根据一个对象来创建(实际使用中一般是映射到数据库对象),然后可以添加一些过滤条件。 Example example = Example.create(u).ignoreCase().enableLike(MatchMode.ANYWHERE); //忽略大小写,以及对于String类型的属性进行模糊匹配
    6. Project主要是让Criteria能够进行报表查询,并可以进行分组。Project主要有SimpleProject、ProjectionList、Property三个实现类,其中SimpleProject、ProjectionList的实例化是由内建的Projections来完成。如:提供avg、count、max、min、sum等,让开发者能够很容易的对某字段进行统计查询。Property是对某个字段进行查询条件的设置,如:Property.forName("color‘).in(new String[]{"black","red","write"});则可以创建一个Property实例,通过Criteria的add(Project)方法加入到查询条件中去。

二、Criteria查询接口的用法:

  • 1、Criteria无条件查询

无条件查询,即不输入任何查询条件,此时,会将表中的所有的数据都查询出来

org.hibernate.Criteria接口表示一个特定持久类的查询,Session是Criteria接口的实例工厂。


  • 建表语句
create table login(  username   varchar2(32) primary key,  password   varchar2(32) not null ,  age      number(3));insert into loginselect '张三','123456',21 from dual unionselect 'Tom','123123',34 from dual unionselect 'Jack','12345678',34 from dual unionselect '李四','qwerty',23 from dual;         commit;
  • Hibernate.cfg.xml
jdbc:oracle:thin:@127.0.0.1:1521:XE
oracle.jdbc.driver.OracleDriver
SYSTEM
SYSTEM
org.hibernate.dialect.Oracle10gDialect
true
true
  • Bean持久类
package criteria.unconditional.bean;import java.io.Serializable;public class Login implements Serializable{    private static final long serialVersionUID = 1L;        private String username;    private String password;    private int age;        public Login(){            }        public Login(String username, String password) {        this.username = username;        this.password = password;    }        public Login(String username, String password, int age) {        this.username = username;        this.password = password;        this.age = age;    }        public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }    }
  • Bean.hbm.xml持久化配置类
  • 测试类
package criteria.unconditional.dao;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 criteria.unconditional.bean.Login;/** * 无条件查询测试类 *  * @author wxf * */public class Demo {    /**     * Criteria无查询条件查询所有     */    public static void main(String[] args) {        // 声明一个集合用来接收结果        List
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()); } }}
  • 查询语句
select    this_.USERNAME as USERNAME0_0_,    this_.PASSWORD as PASSWORD0_0_,    this_.AGE as AGE0_0_   from    ROOT.LOGIN this_

  • 2、Criteria单条件查询

加入一个username作为查询条件

Restrictions提供了大量的静态方法,eg:eq(等于)、ge(大于等于)、between等方法来创建Criterion 查询条件(SimpleExpression实例)


  • 测试类
package criteria.unconditional.dao;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 criteria.unconditional.bean.Login;/** * 单条件查询 添加username作为查询条件 *  * @author wxf * */public class Demo1 {    /**     * Criteria无查询条件查询所有     */    public static void main(String[] args) {        // 声明一个集合用来接收结果        List
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); // 添加查询条件 Restrictions.eq是等于的意思,2个参数,第一个为持久化类的属性,第2个为比较的参数值 criteria.add(Restrictions.eq("username", "Tom")); // 查询使用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()); } }}

添加查询条件 Restrictions.eq是等于的意思,2个参数,第一个为持久化类的属性,第2个为比较的参数值

criteria.add(Restrictions.eq("username", "Tom"));

  • 查询语句
select  this_.USERNAME as USERNAME0_0_,  this_.PASSWORD as PASSWORD0_0_,  this_.AGE as AGE0_0_ from  ROOT.LOGIN this_ where  this_.USERNAME=?

  • 3、Criteria多条件查询

查询 23 ~ 25 年龄段内的用户信息

Restrictions提供了大量的静态方法,eg:eq(等于)、ge(大于等于)、between等方法来创建Criterion 查询条件(SimpleExpression实例)


  • 测试类
//年龄小于等25岁的用户criteria.add(Restrictions.le("age", 25));//年龄大于等于23的用户criteria.add(Restrictions.ge("age", 23));
//或者直接用between查询  age >= 23 && age <= 25 的用户信息criteria.add(Restrictions.between("age", 23, 25));
  • 查询语句
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 ?

  • 4、Criteria复合条件查询

查询 age = 23 or username 中含有‘李’字的用户

Restrictions提供了大量的静态方法,eg:eq(等于)、ge(大于等于)、between等方法来创建Criterion 查询条件(SimpleExpression实例)


  • 测试类
//查询年龄为23岁,名字里面有 李 字的用户criteria.add(Restrictions.or(Restrictions.eq("age", 23),Restrictions.like("username", "%李%")));
//或者直接调用sql语句查询criteria.add(Restrictions.sqlRestriction("age=23 or username like '%李%'"));
  • 查询语句
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 ?  )
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常用查询方法

方法 说明
Restrictions.eq() 等于 '='
Restrictions.gt() 大于 '>'
Restrictions.ge() 大于等于 '>='
Restrictions.lt() 小于 '<'
Restrictions.le() 小于等于 '<='
Restrictions.between() sql中的between子句
Restrictions.like() sql中的like子句
Restrictions.in() sql中的in子句
Restrictions.and() sql中的and子句
Restrictions.or() sql中的or子句
Restrictions.isNull() 非空
  • 基本用例
//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%")));

四、Projections常用聚合函数

方法 说明
Projections.rowCount() 统计记录数
Projections.avg() 统计平均值
Projections.max() 统计最大值
Projections.min() 统计最小值
Projections.groupProperty() 进行分组
Projections.count() 统计某一字段的非空记录数
Projections.sum() 针对某一字段求和
  • 基本用例
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
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(); } }}

五、对查询结果进行排序

使用order关键字来对查询结构排序

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

//按年龄降序排序criteria.addOrder(Order.desc("age"));//按姓名升序排序criteria.addOrder(Order.asc("username"));

六、分页显示

  • 基本用例
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
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()); } }}

七、关联

  • 基本用例

转载于:https://www.cnblogs.com/jianshu/p/5593700.html

你可能感兴趣的文章
什么是RMI,什么是RPC,两者之间的区别是什么?
查看>>
解决跨域问题,实例调用百度地图
查看>>
节点实战技术
查看>>
[ 造轮子 ] 手动封装 AJAX (二) —— ES6 版
查看>>
Javascript基础之-强制类型转换(二)
查看>>
在ABAP里取得一个数据库表记录数的两种方法
查看>>
数据结构-顺序循环队列
查看>>
ECMAScript 6入门读书笔记一
查看>>
UML顺序图(sequence diagram)
查看>>
[LeetCode]合并K个排序链表(Merge k Sorted Lists)
查看>>
APICloud分享图片到微信
查看>>
https证书 websocket配置
查看>>
angularjs初识
查看>>
《JavaScript模式》读书笔记(二)字面量和构造函数
查看>>
带你实现一个 JSONP 实例
查看>>
学校 -> 实习 -> 毕业,前端——我一直在路上
查看>>
Java反射-Getters and Setters
查看>>
ImmutableMap不可使用null的问题
查看>>
01背包问题 (动态规划算法)
查看>>
C#实体对象序列化成Json,并让字段的首字母小写
查看>>