分類:
Hibernate共分爲三種查詢:HQL,Criteria,原生SQL
HQL查詢:(適合不復雜的多表查詢)
Hibernate自創操作數據庫的查詢語言,屬於面向對象的查詢語言.
HQL不會出現任何數據庫相關的信息
1.基本查詢:
@Test
public void testHqlBase(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//操作---
// hql語句
String hql = "from Customer";
// 根據hql語句創建查詢對象
Query query = session.createQuery(hql);
// 獲得多個查詢結果
List<Customer> list = query.list();
System.out.println(list);
//提交
tx.commit();
// 關閉資源
session.close();
}
使用createQuery()來創建查詢對象
這裏的hql語句與sql語句不同,hql語句本是這樣的:select * from Customer,但是因爲是查詢*,所以可以省略select *,然後from後的並非數據庫表,因爲hql是面向對象的,所以其實這個Customer是實體類.請看上面標紅的那句話!
然後執行hql語句是使用的session的createQuery(hql),獲得多個數據使用list(),獲得單個數據使用uniqueResult()方法
2.條件查詢
@Test
public void testHql1(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//操作---
// hql語句
//Customer:實體類,cust_id:實體類屬性
String hql = "from Customer where cust_id = 1";
// 根據hql語句創建查詢對象
Query query = session.createQuery(hql);
// 獲得多個查詢結果
Customer u = (Customer) query.uniqueResult();
System.out.println(u);
//提交
tx.commit();
// 關閉資源
session.close();
}
注意hql語句中沒有數據庫的東西就可以,
當然,我們也可以使用佔位符?
於是就要用到setParameter()方法來給佔位符賦值了
類似這樣:
如果在項目中?的順序總是改變,這時候我們使用?作爲佔位符就不太好用了因此,hibernate給我們準備了另外一種自定義佔位符
這裏故意寫了ccc爲的就是說明這是自定義的,而我們一般規範的寫cust_id,但其實寫什麼都可以的!
3.分頁查詢
@Test
public void testHql2(){
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
//操作---
// hql語句
//Customer:實體類,cust_id:實體類屬性
String hql = "from Customer";
// 根據hql語句創建查詢對象
Query query = session.createQuery(hql);
// 設置第一個佔位符?
query.setFirstResult(0);
query.setMaxResults(1);
// 獲得多個查詢結果
List<Customer> list = query.list();
System.out.println(list);
//提交
tx.commit();
// 關閉資源
session.close();
}
這裏要注意hql語句中沒有limit,而是使用了setFirstResult()與setMaxResult()來設置limit?,?的兩個佔位符
Criteria查詢:(適合單表條件查詢)
hibernate自創,徹底無語句面向對象查詢.
1.基本查詢
@Test
public void testCriteria1() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 創建Criteria查詢對象
Criteria c = session.createCriteria(Customer.class);
List<Customer> list = c.list();
System.out.println(list);
// 提交
tx.commit();
//關閉
session.close();
}
使用createCriteria()創建Criteria查詢對象.
因爲是,無語句,所以也就沒有了hql的什麼form class了,所以我們在創建了查詢對象時就指定返回的是那個實體類.
2.條件查詢
@Test
public void testCriteria2() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 創建Criteria查詢對象
Criteria c = session.createCriteria(Customer.class);
// 添加查詢參數
c.add(Restrictions.eq("cust_id", 1l));
// 獲得查詢結果
Customer r = (Customer) c.uniqueResult();
System.out.println(r);
// 提交
tx.commit();
//關閉
session.close();
}
條件查詢,這裏使用了一個Restrictions類提供衆多的方法,比如isNull()等
3.分頁查詢
@Test
public void testCriteria3() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
// 創建Criteria查詢對象
Criteria c = session.createCriteria(Customer.class);
c.setFirstResult(0);
c.setMaxResults(1);
List<Customer> list = c.list();
System.out.println(list);
// 提交
tx.commit();
//關閉
session.close();
}
這裏與Hql差不多,如果我們要分頁的話還要知道總行數,這裏就用到了聚合函數獲得總行數的需求
使用如下代碼,設置查詢的聚合函數:
// 創建Criteria查詢對象
Criteria c = session.createCriteria(Customer.class);
c.setProjection(Projections.rowCount());
Long count = (Long) c.uniqueResult();
原生SQL
1.基本查詢
@Test
public void testSql() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String sql = "select * from cst_customer";
SQLQuery query = session.createSQLQuery(sql);
List<Object[]> list = query.list();
for(Object[] objs : list){
System.out.println(Arrays.toString(objs));
}
//關閉資源
session.close();
}
這個應該很熟悉,只是生成查詢對象的方法是createSQLQuery(),然後查詢的每一行是一個Object[]數組,如果我們先用對象Customer代替Object[]請看下邊,使用addEntity(class)
2.條件查詢
@Test
public void testSql2() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String sql = "select * from cst_customer where cust_id = ?";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Customer.class);
query.setParameter(0, 1);
List<Customer> list = query.list();
System.out.println(list);
//關閉資源
session.close();
}
其中,因爲使用了addEntity(class)方法,所以查詢結果返回的不是Object[]而是Class實體類Customer,這裏設置參數用到的setParameter()之前也用過.
3.分頁查詢
@Test
public void testSql3() {
// TODO Auto-generated method stub
Session session = HibernateUtils.openSession();
Transaction tx = session.beginTransaction();
String sql = "select * from cst_customer limit ?,?";
SQLQuery query = session.createSQLQuery(sql);
query.addEntity(Customer.class);
query.setParameter(0, 0);
query.setParameter(1, 1);
List<Customer> list = query.list();
System.out.println(list);
//關閉資源
session.close();
}