1. 程式人生 > >Hibernate中利用Criteria進行資料庫表資料的增加查詢。

Hibernate中利用Criteria進行資料庫表資料的增加查詢。

       Hibernate 提供了操縱物件和相應的 RDBMS 表中可用的資料的替代方法。一種方法是標準的 API,它允許你建立一個標準的可程式設計查詢物件來應用過濾規則和邏輯條件。


        Hibernate Session 介面提供了 createCriteria() 方法,可用於建立一個 Criteria 物件,使當您的應用程式執行一個標準查詢時返回一個持久化物件的類的例項.

Criteria criteria=session.createCriteria(StudentInfoEntity.class);

1.使用持久化註解(以JPA標準註解為主,如有需要使用hibernate本身提供的註解)將pojo轉換為po
具體步驟(建專案請參考前一篇博文):
a)在src目錄下建包,並配置好hibernate.cfg.xml(如圖)


b)進入By database Scheam

c)去資料庫建立相應表

d)注意如下配置選擇


e)至此我們會在src/com包下生成StudentInfoEntity.java類

註解名

含義

@Entity

被@Entity註解修飾的類,說明這個class是實體類,並且使用預設的orm規則,即class名即資料庫表中表名,class欄位名即表中的欄位名如果想改變這種預設的orm規則,就要使用

@Table

@Table註釋指定了Entity所要對映帶資料庫表,其中@Table.name()用來指定對映表的表名。

如果預設@Table註釋,系統預設採用類名作為對映表的表名。實體Bean的每個例項代表資料表中的一行資料,行中的一列對應例項中的一個屬性。

@Column

@Column註釋定義了將成員屬性對映到關係表中的哪一列和該列的結構資訊,屬性如下:

1)name:對映的列名。如:對映tbl_user表的name列,可以在name屬性的上面或getName方法上面加入;

2)unique:是否唯一;

3)nullable:是否允許為空;

4)length:對於字元型列,length屬性指定列的最大字元長度;

5)insertable:是否允許插入;

6)updatetable:是否允許更新;

7)columnDefinition:定義建表時建立此列的DDL;

8)secondaryTable:從表名。如果此列不建在主表上(預設是主表),該屬性定義該列所在從表的名字。

@Basic

@Basic表示一個簡單的屬性到資料庫表的欄位的對映,對於沒有任何標註的getXxxx()方法,預設 即為 @Basic

fetch: 表示該屬性的讀取策略,有EAGER和LAZY兩種,分別表示主支抓取和延遲載入,預設為EAGER.

(1)、FetchType.LAZY:懶載入,載入一個實體時,定義懶載入的屬性不會馬上從資料庫中載入。

(2)、FetchType.EAGER:急載入,載入一個實體時,定義急載入的屬性會立即從資料庫中載入。

@Id

@Id 標註用於宣告一個實體類的屬性對映為資料庫的主鍵列。該屬性通常置於屬性宣告語句之前,可與宣告語句同行,也可寫在單獨行上。@Id標註也可置於屬性的getter方法之前。

f)建立測試類進行增刪改查,增刪改都和前一篇博文一樣,這裡我們介紹一些查詢方法



2.查詢條件的限制
可以使用 Criteria 物件可用的 add() 方法去新增一個標準的限制。
//建立一個 Criteria 物件

Criteria criteria=session.createCriteria(StudentInfoEntity.class);
      
//增加查詢條件(user_name為“張三”的學生資訊)criteria.add(Restrictions.eq("userName","張三"));
       
//得到結果集List<StudentInfoEntity> list=criteria.list();

//在控制檯列印結果集
        list.forEach(a-> System.
out.println("學生id:"+a.getId()+姓名:"+a.getUserName()+年齡:    "+a.getUserAge()+性別:"+a.getUserSex()+身高:"+a.getUserHeight()));

1. 基本查詢

根據姓名查詢特定學生資訊
package com.pojo;
  
  import org.hibernate.Criteria;
  import org.hibernate.Session;
  import org.hibernate.SessionFactory;
  import org.hibernate.Transaction;
  import org.hibernate.cfg.Configuration;
  import org.hibernate.criterion.Restrictions;
  
  import java.util.List;
  
  public class queryByCondition {
    public static void main(String[] args) {
        //例項化Configuration
        Configuration config=new Configuration().configure();
        //建立會話工廠
        SessionFactory sf=config.buildSessionFactory();
        //建立會話
        Session session=sf.openSession();
        //建立一個 Criteria 物件
        Criteria criteria=session.createCriteria(StudentInfoEntity.class);
       //增加查詢條件(user_name為“張三”的學生資訊)criteria.add(Restrictions.eq("userName","張三"));
        //得到結果集
        List<StudentInfoEntity> list=criteria.list();
//在控制檯列印結果集
        list.forEach(a-> System.out.println("學生id:"+a.getId()+姓名:"+a.getUserName()+年齡:"+a.getUserAge()+性別:"+a.getUserSex()+身高:"+a.getUserHeight()));
        //關閉會話
        session.close();
        //關閉會話工廠
        sf.close();
    }
}


Session session=sf.openSession();
//建立一個 Criteria 物件
  Criteria criteria=session.createCriteria(StudentInfoEntity.class);
  //查詢所有學生資訊得到結果集List<StudentInfoEntity> list=criteria.list();
//在控制檯列印結果集
list.forEach(a-> System.out.println("學生id:"+a.getId()+姓名:"+a.getUserName()+年齡:"+a.getUserAge()+性別:"+a.getUserSex()+身高:"+a.getUserHeight()));

//建立一個 Criteria 物件
Criteria criteria=session.createCriteria(StudentInfoEntity.class);
  //增加查詢條件(年齡在20-30之間的所有學生資訊)
//criteria.add(Restrictions.gt("userAge ", 20)).add(Restrictions.lt("userAge ", 30));criteria.add(Restrictions.between("userAge",new Integer(20),new Integer(30)));
 //得到結果集
 List<StudentInfoEntity> list=criteria.list();

//建立一個 Criteria 物件
 Criteria criteria=session.createCriteria(StudentInfoEntity.class);
  //增加查詢條件(身高為null的學生資訊)
 criteria.add(Restrictions.isNull("userHeight"));
 //得到結果集
 List<StudentInfoEntity> list=criteria.list();

//建立一個 Criteria 物件
 Criteria criteria=session.createCriteria(StudentInfoEntity.class);
  //增加查詢條件(年齡等於25或者身高為null的學生物件)criteria.add(Restrictions.or(Restrictions.eq("userAge",new Integer(25)),
         Restrictions.isNull("userHeight")));
 //得到結果集
 List<StudentInfoEntity> list=criteria.list();


Session session=sf.openSession();
  //建立一個 Criteria 物件
  Criteria criteria=session.createCriteria(StudentInfoEntity.class);
  //根據id降序排列
criteria.addOrder(Order.desc("id"));
  //得到結果集
  List<StudentInfoEntity> list=criteria.list();
//在控制檯列印結果集
list.forEach(a-> System.out.println("學生id:"+a.getId()+姓名:"+a.getUserName()+年齡:"+a.getUserAge()+性別:"+a.getUserSex()+身高:"+a.getUserHeight()));

//建立一個 Criteria 物件
 Criteria criteria=session.createCriteria(StudentInfoEntity.class);
  //增加查詢條件(查詢"張三","王五","田七"三人資訊)String[] names={"張三","王五","田七"};
 criteria.add(Restrictions.in("userName",names));
 //得到結果集
 List<StudentInfoEntity> list=criteria.list();

4、分頁查詢
這裡有兩種分頁標準介面方法:

方法

描述

public Criteria setFirstResult(int firstResult)

firstResult屬性設定查詢起始行

public Criteria setMaxResults(int maxResults)

maxResults 屬性設定需要查詢的行數。

 
//建立一個 Criteria 物件
  Criteria criteria=session.createCriteria(StudentInfoEntity.class);
  //設定查詢起始行
  criteria.setFirstResult(0);
  //設定需要查詢的行數
  criteria.setMaxResults(5);
  //得到結果集
  List<StudentInfoEntity> list=criteria.list();