基本查詢
import java.util.List;
import org.hibernate.SQLQuery;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.query.NativeQuery;
import org.hibernate.query.Query;
import org.junit.jupiter.api.Test;
import com.fei.domain.Customer;
import com.fei.utils.HibernateUtils;
/**
* 測試Hibernate中原生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查詢對象(面向接口編程)
Query<Customer> query = session.createNativeQuery(sql, Customer.class);
// 3)獲得結果
List<Customer> list = query.list();
System.out.println(list);
// =====================================
// 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 where cust_id = :id";
// 2)創建原生sql查詢對象
Query<Customer> query = session.createNativeQuery(sql, Customer.class).setParameter("id", 2l);
// 3)獲得結果
List<Customer> list = query.list();
System.out.println(list);
// =====================================
// 4提交事務,關閉資源
tx.commit();
session.close();
}
注意:hibernate5在使用原生的sql查詢時,占位符要使用:id
的形式,使用?的形式會報異常。至少我測試的時候是這樣(((φ(◎ロ◎;)φ)))
分頁查詢
@Test
// 分頁查詢
public void fun3() {
// 1獲得session
Session session = HibernateUtils.openSession();
// 2開啟事務
Transaction tx = session.beginTransaction();
// 3執行操作
// =====================================
// 1)書寫原生sql語句
String sql = "select * from cst_customer limit :beginPos, :maxResult";
// 2)創建原生sql查詢對象
Query<Customer> query = session.createNativeQuery(sql, Customer.class);
query.setParameter("beginPos", 0);
query.setParameter("maxResult", 2);
// 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 count(*) from cst_customer";
// 2)創建原生sql查詢對象
Query<?> query = session.createNativeQuery(sql);
// 3)獲得結果
List<?> list = query.list();
System.out.println(list.get(0));
// 這種方式也是可以的,當知道結果只有一條時
// Object result = query.uniqueResult();
// =====================================
// 4提交事務,關閉資源
tx.commit();
session.close();
}
封裝的HibernateUtils工具類
package com.fei.utils;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
public class HibernateUtils {
private static SessionFactory sf;
// 為保證一個應用只有一個SessionFactory對象
static {
// 1.創建並讀取指定配置文件,空參默認加載src路徑下的名為hibernate.cfg.xml
Configuration conf = new Configuration().configure();
// 2.根據配置信息,創建SessionFactory對象
sf = conf.buildSessionFactory();
}
// 獲得全新session
public static Session openSession() {
// 3.獲得新的session對象並返回
return sf.openSession();
}
// 獲得與線程綁定的session
public static Session getCurrentSession() {
// 3.獲得與線程綁定的session對象並返回
return sf.getCurrentSession();
}
}