Hibernate 查詢資料
阿新 • • 發佈:2019-02-09
Hibernate 檢索方式
- 類級別檢索:當前物件所有屬性值。例如:Customer自己資料
- 關聯級別檢索:當前物件關聯物件資料。例如:Customer 關聯 Order 資料
1 檢索概述
- 通過OID檢索
get() 立即查詢,如果沒有返回null。
load() 預設延遲檢查,如果沒有結果拋異常。
使用以上兩個方法進行查詢,結果都為持久態物件,持久物件就在一級快取中。
物件導航圖 : 通過持久物件自動獲得關聯物件。
例如:customer.getOrderSet().size()原始SQL語句
session.createSQLQuery ("sql語句") ,理論進行優化,提供效能。建議不用。
QBC ,hibernate 提供 純面向物件查詢語句,Query By Criteria,弱化。
HQL ,hibernate 提供面向物件查詢語句。類似SQL語句(重點)
HQL 使用物件和物件屬性,SQL語句使用表名和欄位名稱。
物件和屬性區分大小寫的。表名和欄位名稱不區分大小寫。
1 類級別
類級別:查詢當前類的所有內容,只查詢一次。優化指的是查詢時機優化,讓空閒時間伺服器做出其他處理。
session.get(Customer.class ,oid) 通過OID立即檢索(查詢),如果資料不存在返回null 。
session.load(Customer.class , oid ) 預設通過OID延遲檢索,如果資料不存在將拋異常。
1 Hibernate 載入配製檔案 獲取session
public class H3Utils {
//提供一個工廠 (鏈式操作)
private static SessionFactory factory =
new Configuration()
.configure("android/longs/study/config/hibernate.cfg.xml")
.buildSessionFactory();
/**
* 獲得執行緒繫結的session
* @return
*/
public static Session getCurrentSession(){
return factory.getCurrentSession();
}
}
1 查詢所有
//HQL 方式
public void queryAllFunction1(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//HQL
Query query = session.createQuery("from Customer");
//獲取
List<Customer> allCustomer = query.list();
session.getTransaction().commit();
session.close();
}
//HQL 方式
public void queryAllFunction2(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//HQL 可以使用別名 , 這裡的別名為 c ,可以使用別名來代替 select 中的 *
Query query = session.createQuery("select c from Customer as c");
//獲取
List<Customer> allCustomer = query.list();
session.getTransaction().commit();
session.close();
}
//sql 語句方式
public void queryAllFunction3(){
Session session = factory.openSession();
session.beginTransaction();
//2 SQL
SQLQuery sqlQuery = session.createSQLQuery("select * from t_customer");
// * 必須設定查詢結果封裝到那個物件中
sqlQuery.addEntity(Customer.class);
//獲取資料
List<Customer> allCustomer = sqlQuery.list();
session.getTransaction().commit();
session.close();
}
//QBC方式
public void queryAllFunction4(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//QBC
Criteria criteria = session.createCriteria(Customer.class);
//獲取資料
List<Customer> allCustomer = criteria.list();
session.getTransaction().commit();
session.close();
}
2 通過 id 來查詢單個數據
- hql 方式根據指定id來查詢
public void queryCuseromeFromIdToHQL(int id) {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//建立 hql
Customer customer =(Customer) session.createQuery("from Customer c where c.cid = 1").uniqueResult();
session.getTransaction().commit();
session.close();
}
- sql方式根據指定id來查詢
public void queryCuseromeFromIdToSQL(int id) {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//構建sql
String sql = "select * from t_customer c where c.cid= "+id;
//通過 sql 來查詢對應的資料
Customer customer =
(Customer) session
.createSQLQuery(sql)//執行sql
.addEntity(Customer.class)//封裝資料的實體型別
.uniqueResult();//獲取一個物件
session.getTransaction().commit();
session.close();
}
- QBC方式根據指定id來查詢
public void queryCuseromeFromIdToQBC(int id) {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//QBC
Customer customer =
(Customer) session
.createCriteria(Customer.class)
.add(Restrictions.eq("cid", 1)) //新增約束
.uniqueResult();
session.getTransaction().commit();
session.close();
}
3 排序查詢
- hql 方式查詢排序
public void queryAllDescFunctonForHQL(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//構建HQL語句
String hql = "from Customer c order by c.cid desc";
// 1 hql , 格式: order by 屬性名 [asc]|desc
List<Customer> allCustomer =
session.createQuery(hql).list();
session.getTransaction().commit();
}
- sql方式查詢排序
public void queryAllDescFunctonForSql(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//構建sql 語句
String sql = "select * from t_customer order by cid desc";
// 2 sql
List<Customer> allCustomer =
session.createSQLQuery(sql)
.addEntity(Customer.class)
.list();
session.getTransaction().commit();
}
- QBC方式方式查詢排序
public void queryAllDescFunctonForQBC(){
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
// 3 qbc 注意Order
List<Customer> allCustomer =
session.createCriteria(Customer.class)
.addOrder(org.hibernate.criterion.Order.desc("cid"))
.list();
session.getTransaction().commit();
}
4 查詢部分內容
- hql 方式查詢部分內容
//通過hql方式來查詢 部分內容
public void queryPartForHql() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//構建語句
String hql = "select new Customer(cid,name) from Customer";
/*
* hql 查詢,預設將查詢結果封裝到 Object[] 中,但我們需要封裝指定物件中
* 可以 提供構造方法,將查詢結果通過構造方法直接建立物件。
* 投影查詢,查詢結果為脫管態
* 注意對應的類 Customer 中要有對應的 構造
*/
List<Customer> allCustomer = session.createQuery(hql).list();
session.getTransaction().commit();
session.close();
}
- sql方式查詢部分內容
//通過SQL方式來查詢 部分內容
public void queryPartForSql() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//構建語句
String sql = "select cid,name from t_customer";
//查詢
List<Customer> allCustomer = session.createSQLQuery(sql).addEntity(Customer.class).list();
session.getTransaction().commit();
}
- QBC方式查詢部分內容
//通過QBC方式來查詢 部分內容
public void queryPartForQBC() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
List<Customer> allCustomer =
session.createCriteria(Customer.class)//設定資料封裝的類
.setProjection(
Projections.projectionList()
.add(Projections.alias(Projections.property("cid"), "cid"))//新增 查詢的部分
.add(Projections.alias(Projections.property("name"), "name"))//新增 查詢的部分
)
.setResultTransformer( new AliasToBeanResultTransformer(Customer.class))
.list();
session.getTransaction().commit();
}
5 分頁查詢
- hql 方式分頁查詢
//通過 HQL 分頁查詢
public void queryPageHql() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//1 hql , 不能手動設定limit
List<Customer> allCustomer = session.createQuery("from Customer")
.setFirstResult(0)//查詢的頁數
.setMaxResults(2)//每頁查詢的個數
.list();
session.getTransaction().commit();
}
- sql方式分頁查詢
//通過 sql 分頁查詢
public void queryPageSQL() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//構建 語句
String sql1 = "select * from t_customer ";
List<Customer> allCustomer = session.createSQLQuery(sql1)
.addEntity(Customer.class)//設定資料封裝的物件
.setFirstResult(0)//設定開始查詢的頁數
.setMaxResults(2)//設定每頁可以查詢的資料個數
.list();
// 這裡可以使用 limit 方式 來進行查詢
String sql2 = "select * from t_customer limit 0,2";
List<Customer> allCustomer2 = session.createSQLQuery(sql2)
.addEntity(Customer.class)
.list();
session.getTransaction().commit();
session.close();
}
- QBC方式分頁查詢
//通過 QBC 分頁查詢
public void queryPageQBC() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
List<Customer> allCustomer = session.createCriteria(Customer.class)
.setFirstResult(0)//設定開始查詢的頁數
.setMaxResults(2)//設定每頁查詢的元素的個數
.list();
session.getTransaction().commit();
session.close();
}
6 繫結引數進行查詢
- hql 方式繫結引數查詢
//Hql 繫結引數查詢
public void queryParamForHql(int num) {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//佔位符方式
String hql1 = "from Customer c where c.cid = ? ";
Customer customer = (Customer) session.createQuery(hql1)
.setInteger(0, num)//第0個引數 值為num
.uniqueResult();
//別名方式
String hql2 = "from Customer c where c.cid = :xx ";
Customer customer2 = (Customer) session.createQuery(hql1)
.setInteger("xx", num)//第0個引數 值為num
.uniqueResult();
session.getTransaction().commit();
}
- sql方式繫結引數查詢
//SQL繫結引數查詢
public void queryParamForSql(int id) {
Session session = factory.openSession();
session.beginTransaction();
//構建sql
String sql = "select * from t_customer c where c.cid= "+id;
//通過 sql 來查詢對應的資料
Customer customer =
(Customer) session
.createSQLQuery(sql)//執行sql
.addEntity(Customer.class)//封裝資料的實體型別
.uniqueResult();//獲取一個物件
session.getTransaction().commit();
}
- QBC方式繫結引數查詢
//QBC繫結引數查詢
public void queryParamForQBC() {
Session session = H3Utils.getCurrentSession();
session.beginTransaction();
//QBC
Customer customer =
(Customer) session
.createCriteria(Customer.class)
.add(Restrictions.eq("cid", 1)) //新增約束
.uniqueResult();
session.getTransaction().commit();
session.close();
session.getTransaction().commit();
}
7 聚合函式
public void demo07(){
Session session = factory.openSession();
session.beginTransaction();
//1 hql
// * uniqueResult() 如果查詢結果數大於1拋異常,如果是1返回結果,如果0返回null
//HQL 方式一
Object objCount = session.createQuery("select count(*) from Customer").uniqueResult();
//HQL 方式二
Long numCount = (Long)session.createQuery("select count(c) from Customer c").uniqueResult();
//2 sql
BigInteger sqlCount = (BigInteger) session.createSQLQuery("select count(cid) from t_customer").uniqueResult();
//3 qbc
Long numObj = (Long)session.createCriteria(Customer.class)
.setProjection(
Projections.projectionList()
.add(Projections.rowCount())
)
.uniqueResult();
//列印
int num = numObj.intValue();
System.out.println(num);
session.getTransaction().commit();
session.close();
}