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());
        }

    }
    
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM