1. 程式人生 > >hibernate框架學習筆記7:HQL查詢、Criteria查詢

hibernate框架學習筆記7:HQL查詢、Criteria查詢

import res ber return org close 返回 closed 所有

HQL查詢:hibernate獨有的查詢語言

適用於不復雜的多表查詢

示例:

實體類:

技術分享圖片
package domain;

public class Customer {
    
    private Long cust_id;
    private String cust_name;
    private String cust_source;
    private String cust_industry;
    private String cust_level;
    private String cust_linkman;
    private String cust_phone;
    
private String cust_mobile; public Long getCust_id() { return cust_id; } public void setCust_id(Long cust_id) { this.cust_id = cust_id; } public String getCust_name() { return cust_name; } public void setCust_name(String cust_name) { this.cust_name = cust_name; }
public String getCust_source() { return cust_source; } public void setCust_source(String cust_source) { this.cust_source = cust_source; } public String getCust_industry() { return cust_industry; } public void setCust_industry(String cust_industry) {
this.cust_industry = cust_industry; } public String getCust_level() { return cust_level; } public void setCust_level(String cust_level) { this.cust_level = cust_level; } public String getCust_linkman() { return cust_linkman; } public void setCust_linkman(String cust_linkman) { this.cust_linkman = cust_linkman; } public String getCust_phone() { return cust_phone; } public void setCust_phone(String cust_phone) { this.cust_phone = cust_phone; } public String getCust_mobile() { return cust_mobile; } public void setCust_mobile(String cust_mobile) { this.cust_mobile = cust_mobile; } @Override public String toString() { return "Customer [cust_id=" + cust_id + ", cust_name=" + cust_name + "]"; } }
View Code

自定義工具類:

技術分享圖片
package utils;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtils {
    private static SessionFactory sf;
    
    static{
        //1 創建,調用空參構造
        Configuration conf = new Configuration().configure();
        //2 根據配置信息,創建 SessionFactory對象
         sf = conf.buildSessionFactory();
    }
    
    //獲得session => 獲得全新session
    public static Session openSession(){
                //3 獲得session
                Session session = sf.openSession();
                
                return session;
        
    }
    //獲得session => 獲得與線程綁定的session
    public static Session getCurrentSession(){
        //3 獲得session
        Session session = sf.getCurrentSession();
        
        return session;
    }    
}
View Code

測試類:

package hql;

import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import domain.Customer;
import utils.HibernateUtils;

//測試HQL語句
public class Demo {

    @Test
    //基本查詢
    public void fun1(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //1> 書寫HQL語句
        //String hql = " from domain.Customer ";
        String hql = " from Customer "; // 如果查詢所有Customer對象,可省略全名
        //2> 根據HQL語句創建查詢對象
        Query query = session.createQuery(hql);
        //3> 根據查詢對象獲得查詢結果
        List<Customer> list = query.list();    // 返回list結果
        //query.uniqueResult();//接收唯一的查詢結果
        
        System.out.println(list);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
    }
    
    @Test
    //條件查詢
    //HQL語句中,不可能出現任何數據庫相關的信息的
    //不會出現數據庫的表名類名字段名,使用的是實體類的屬性名
    public void fun2(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //1> 書寫HQL語句
        String hql = " from Customer where cust_id = 1 "; // 查詢所有Customer對象
        //2> 根據HQL語句創建查詢對象
        Query query = session.createQuery(hql);
        //3> 根據查詢對象獲得查詢結果
        Customer c = (Customer) query.uniqueResult();
        
        System.out.println(c);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
    
    @Test
    //條件查詢
    //問號占位符
    public void fun3(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //1> 書寫HQL語句
        String hql = " from Customer where cust_id = ? "; // 查詢所有Customer對象
        //2> 根據HQL語句創建查詢對象
        Query query = session.createQuery(hql);
        //設置參數
        //query.setLong(0, 1l);
        query.setParameter(0, 1l);
        //3> 根據查詢對象獲得查詢結果
        Customer c = (Customer) query.uniqueResult();
        
        System.out.println(c);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
    
    @Test
    //條件查詢
    //命名占位符
    public void fun4(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //1> 書寫HQL語句
        String hql = " from Customer where cust_id = :cust_id "; // 查詢所有Customer對象
        //2> 根據HQL語句創建查詢對象
        Query query = session.createQuery(hql);
        //設置參數
        query.setParameter("cust_id", 1l);
        //3> 根據查詢對象獲得查詢結果
        Customer c = (Customer) query.uniqueResult();
        
        System.out.println(c);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
    
    @Test
    //分頁查詢
    public void fun5(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //1> 書寫HQL語句
        String hql = " from Customer  "; // 查詢所有Customer對象
        //2> 根據HQL語句創建查詢對象
        Query query = session.createQuery(hql);
        //設置分頁信息 limit ?,?
        query.setFirstResult(0);
        query.setMaxResults(1);
        //3> 根據查詢對象獲得查詢結果
        List<Customer> list =  query.list();
        
        System.out.println(list);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
}

Criteria查詢:

hibernate獨創的,無語句面向對象查詢

適用於單表查詢

示例:

package criteria;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.junit.Test;

import domain.Customer;
import utils.HibernateUtils;

//測試Criteria查詢
public class Demo {

    @Test
    //基本查詢
    public void fun1(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        
        //查詢所有的Customer對象
        Criteria criteria = session.createCriteria(Customer.class);
        
        List<Customer> list = criteria.list();
        
        System.out.println(list);
        
//        Customer c = (Customer) criteria.uniqueResult();
        
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
    
    @Test
    //條件查詢
    //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
    public void fun2(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //創建criteria查詢對象
        Criteria criteria = session.createCriteria(Customer.class);
        //添加查詢參數 => 查詢cust_id為1的Customer對象
        criteria.add(Restrictions.gt("cust_id", 1l));
        //執行查詢獲得結果
        Customer c = (Customer) criteria.uniqueResult();
        System.out.println(c);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
    
    
    
    @Test
    //分頁查詢
    public void fun3(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //創建criteria查詢對象
        Criteria criteria = session.createCriteria(Customer.class);
        //設置分頁信息 limit ?,?
        criteria.setFirstResult(1);
        criteria.setMaxResults(2);
        //執行查詢
        List<Customer> list = criteria.list();
        
        System.out.println(list);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
    
    @Test
    //查詢總記錄數
    public void fun4(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //創建criteria查詢對象
        Criteria criteria = session.createCriteria(Customer.class);
        //設置查詢的聚合函數 => 總行數
        criteria.setProjection(Projections.rowCount());
        //執行查詢
        Long count = (Long) criteria.uniqueResult();
        
        System.out.println(count);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
}

原生SQL查詢:

適用於相當復雜的業務

package sql;

import java.util.Arrays;
import java.util.List;

import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test;

import domain.Customer;
import utils.HibernateUtils;

//測試原生SQL查詢
public class Demo {

    @Test
    //基本查詢
    public void fun1(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //1 書寫sql語句
        String sql = "select * from cst_customer";
        
        //2 創建sql查詢對象
        SQLQuery query = session.createSQLQuery(sql);
        
        //3 調用方法查詢結果
        List<Object[]> list = query.list();
        //query.uniqueResult();
        
        for(Object[] objs : list){
            System.out.println(Arrays.toString(objs));
        }
        
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
    
    @Test
    //基本查詢
    public void fun2(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //1 書寫sql語句
        String sql = "select * from cst_customer";
        
        //2 創建sql查詢對象
        SQLQuery query = session.createSQLQuery(sql);
        //指定將結果集封裝到哪個對象中
        query.addEntity(Customer.class);
        
        //3 調用方法查詢結果
        List<Customer> list = query.list();
        
        System.out.println(list);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
    
    @Test
    //條件查詢
    public void fun3(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //1 書寫sql語句
        String sql = "select * from cst_customer where cust_id = ? ";
        
        //2 創建sql查詢對象
        SQLQuery query = session.createSQLQuery(sql);
        
        query.setParameter(0, 1l);
        //指定將結果集封裝到哪個對象中
        query.addEntity(Customer.class);
        
        //3 調用方法查詢結果
        List<Customer> list = query.list();
        
        System.out.println(list);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
    
    @Test
    //分頁查詢
    public void fun4(){
        //1 獲得session
        Session session = HibernateUtils.openSession();
        //2 控制事務
        Transaction tx = session.beginTransaction();
        //3執行操作
        //-------------------------------------------
        //1 書寫sql語句
        String sql = "select * from cst_customer  limit ?,? ";
        
        //2 創建sql查詢對象
        SQLQuery query = session.createSQLQuery(sql);
        
        query.setParameter(0, 0);
        query.setParameter(1, 1);
        //指定將結果集封裝到哪個對象中
        query.addEntity(Customer.class);
        
        //3 調用方法查詢結果
        List<Customer> list = query.list();
        
        System.out.println(list);
        //-------------------------------------------
        //4提交事務.關閉資源
        tx.commit();
        session.close();
        
        
    }
}

hibernate框架學習筆記7:HQL查詢、Criteria查詢