Hibernate(十二)Criteria查询

一、简述

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 ‘张三‘,‘123456‘,21 from dual union
select ‘Tom‘,‘123123‘,34 from dual union
select ‘Jack‘,‘12345678‘,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());
        }

    }

}
时间: 2024-08-06 11:58:23

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

Hibernate(十二)Session缓存与二级缓存

一级缓存主要作用是管理对象. 应用程序级别的缓存(SessionFactory级别的缓存),也叫二级缓存,默认是不开启的. 不管是一级缓存还是二级缓存,都需要根据OID获取对象才有效. package test.hibernate.hbmSecondCache; import java.util.HashSet; import java.util.Set; public class Department { private Integer id; private String name; pri

Hibernate框架之Criteria 详解

自从学数据库以来,从SQL查询-HQL查询-到Criteria 查询.有人问我:掌握一种查询语句不就可以吗,为什么还要学Criteria 查询?我回答道:用到特定于数据库的SQL 语句,程序本身会依赖于特定的数据库,不了解SQL 语句,恐怕对使用HQL带来困难.Hibernate提供的Criteria查询帮助我们解决了这种问题. 下面介绍一下Criteria查询. 1.Criteria 查询采用面向对象方式封装查询条件,又称为对象查询 2.对SQL 语句进行封装 3.采用对象的方式来组合各种查询

Hibernate(十二):HQL查询(一)

概述 Hibernate提供了以下几种检索对象的方式 1)导航对象图检索方式:根据已经加载的对象导航到其他对象: 2)OID检索方式:按照对象的OID来检索对象: 3)HQL检索方式:使用面向对象的HQL查询语言: 4)QBC检索方式:使用QBC(Query By Criteria)API来检索对象.这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口. 5)本地SQL检索的方式:使用本地数据的SQL查询语句. HQL(Hibernate Query Language)面向对象

hibernate条件查询 Criteria查询

criteria查询 的方法详解 1.获取 criteria对象 Criteria criteria = this.getSession().createCriteria(Record.class); 红色部分为实体类,此处的Record代表信息记录类 2.追加条件 criteria = criteria.add(Expression.eq("level", 1)); 红色部分 Expression.eq("",""),两个参数第一个是 实体类中

NHibernate系列文章二十二:NHibernate查询之HQL查询(附程序下载)

摘要 NHibernate提供了多种查询方式,最早的HQL语言查询.Criteria查询和SQL Query,到NHibernate 3.0的Linq NHibernate,NHIbernate 4.0又添加了Query Over.每种方式各有优缺点,任何一个SQL查询可以使用任何查询方式查询.根据程序员每种方式掌握的情况,可以使用不同的查询方式.本篇文章介绍HQL语言查询.HQL(Hibernate Query Language)是NHibernate特有的面向对象查询语言,他具有继承.多态的

(十二)分组查询

(十二)分组查询 将数据表中的数据按某种条件分成组,按组显示统计信息 查询各班学生的最大年龄.最小年龄.平均年龄和人数 分组 SELECT <字段名表1> FROM <表名> -- 这里字段名表1 应该 是 按照字段名表2 分组以后 能够产生唯一值的 字段(如:班级) [WHERE <条件> ] GROUP BY <字段名表2> [HAVING <条件> ] [ORDER BY <字段名列表3> ] --例1 查询各班学生的最大年龄.

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

Hibernate框架提供了HQL查询和Criteria 查询.下面对这两种查询分别做个例子.也好对这两种查询方法有个大概的了解.就用房屋信息表做例子,查询所有房屋信息. HQL语句查询所有房屋信息: /* * 查询所有房屋 * * (non-Javadoc) * @see Dao.HouseDao#selecthouse() */ public List<House> selecthouse() { // TODO Auto-generated method stub //获取连接 Sess

Hibernate检索方式和Criteria查询的讲解

Hibernate框架5种检索方式 1.导航对象图检索方式:根据已经加载的对象导航到其他对象 2.OID检索方式:按照对象的OID来检索对象 3.HQL检索方式:使用面向对象的HQL查询语言 4.QBC检索方式:使用QBC(Query By Criteria)API来检索对象,这种API封装了基于字符串形式的查询语句,提供了更加面向对象的查询接口 5.本地SQL检索方式:使用本地数据库的SQL查询语句 这次重点讲解Criteria查询,首先我们先了解一下它.  Criteria 查询采用面向对象

《Hibernate学习笔记十二》学生、课程、分数关系的设计与实现

<Hibernate学习笔记十二>学生.课程.分数关系的设计与实现 这个马士兵老师的Hibernate视频学习的一个题目,这里面要用到多对多.多对一的关联关系以及联合主键,因此觉得挺好的,自己写篇博文来记录下. 先考虑数据库表 1.学生表:为简单起见,只考虑了学生id和学生姓名,其中id为主键 2.课程表:为简单起见,只考虑了课程id和课程名称,其中id为主键 3.分数表 分数表有两种解决方案 3.1 第一种为:使用联合主键:student_id 和 course_id 3.2 第二种:不使用