hibernate的查詢方式
1 oid的查詢 get() update() delete() save()
2 對象導航的查詢
3 HQL Hibernate query language Hibernate的查詢語言.
4 QBC 對象的方式進行操作
5 sql
==================================================================
1 HQL 查詢方式基於對象的思路進行查詢的,因此條件都是實體里面的變量名作為條件
我們將它划分為二類.
1 字段返回的結果都是object類型的
查詢所有
from Customer 或者 select c from Customer as c
==============================================================
事例:
Query query = session.createQuery("select c from Customer as c"); //相當於sql語句.
List<Customer> list = query.list(); //執行查詢
for (Customer customer : list) {
System.out.println(customer.getCust_name()+"@"+customer.getCust_id());
}
================================================================================
1.2 查詢單個或者多個字段
查詢單個字段語句:
select 變量名 form Customer
查詢多個字段的語句1 返回值不同而已 .返回的是object
select 變量名1,變量名2 .... from 實體
返回的是 list<object>
查詢多個字段的語句2 返回的是查詢語句里面new的實體對象.因此我們必須提供有參構造,並且要保證有無參構造
select new Customer(cust_name,cust_id) form Customer
返回的是 list<customer>
查詢多個字段3 查詢的語句是 select new Map(cust_name as cust_name ,cust_id as cust_id ) form Customer
返回的就是 list<map<string ,object>
方式4 還可以new list(cust_name,cust_id)
返回的是 list<list<object>>
======================================================================= =======
事例:
查詢單個字段的
Query query = session.createQuery("select cust_name from Customer ");
@SuppressWarnings("unchecked")
List<Object> list = query.list();
for (Object object : list) {
System.out.println(object);
}
======================================================
查詢多個字段的哦
Session session = HibernateUtils.openSession();
Query query = session.createQuery("select cust_name,cust_id from Customer ");
@SuppressWarnings("unchecked")
List<Object[]> list = query.list();
for (Object[] object : list) {
System.out.println(Arrays.toString(object));
}
================================================================
Query query = session.createQuery("select new Customer(cust_id,cust_name) from Customer ");
List<Customer> list = query.list();
for (Customer object : list) {
System.out.println(object.getCust_name());
}
=============================================================================---
需要注意我們再map里面as定義的是map的key.然后我們可以通過Beanuitls進行封裝數據到實體對象里面
Query query = session.createQuery("select new Map(cust_id as c,cust_name as d)from Customer ");
List<Map<String , Object>> list = query.list();
for (Map<String, Object> map : list) {
Set<String> set = map.keySet();
for (String string : set) {
//通過key獲得value值
System.out.println(string +"@@" +map.get(string));
}
}
================================================================================
Query query = session.createQuery("select new List(cust_id ,cust_name)from Customer ");
List<List<Object>> list = query.list();
for (List<Object> list2 : list) {
System.out.println(list2.get(0)); //這是獲得的查詢出的cust_id
System.out.println(list2.get(1)); //這是獲得的查詢出的cust_name
}
===========================================================================
1.3 聚合函數注意9 這里的*可以使用
查詢的語句是 select 聚合函數(*) from 實體 注意的是如果是查詢比如求和就不能使用*了
還有需要注意的是使用聚合函數返回的只有唯一的一個值因此接收的API是
query.uniqueResult();
================================================================================
//操作
Query query = session.createQuery("select count(*) from Customer ");//使用hql 面向對象
Object uniqueResult = query.uniqueResult();
System.out.println(uniqueResult);
========================================================================
.4 去重函數
查詢語句 select distinct 去重的變量名 ,變量名2,.......... from 實體 如果是多個字段返回的就是list集合里面是object的數組哦
案例
Session session = HibernateUtils.openSession();
Query query = session.createQuery("select distinct cust_name from Customer c ");
List<Object> list = query.list();
for (Object object : list) {
System.out.println(object);
}
=====================================================================================
1.5 分組查詢
查詢的語句是 select 聚合函數 分組的變量名 from 實體 group by 分組的變量名 返回的是list里面的是object的數組
案例 根據名稱分組 查看人數
// 通過utils工具類,獲得session對象
Session session = HibernateUtils.openSession();
Query query = session.createQuery("select count(*) ,cust_name from Customer c group by cust_name");
List<Object[]> list = query.list();
for (Object[] objects : list) {
System.out.println(Arrays.toString(objects));
=======================================================================================================================
條件查詢
查詢后返回的結果都是實體對象.
2 條件查詢(單個條件,) :cust_id 替代了sql語句里面的問號.
需要的api是
query.setParameter(字段名,值)
查詢語句是 根據的是實體查詢,因此后面的條件是實體的屬性(變量名)作為條件
from Customer where cust_id > :cust_id and cust_name= :cust_name
//給參數賦值,因為是根據前面的key去賦值的因此可以沒有順序哦
query .setParameter("cust_id", 99L);//語句里面需要幾個就賦值幾個哦.
================================================================
事例:
Query query = session.createQuery(" from Customer where cust_id > :cust_id and cust_name= :cust_name ");
//給參數賦值
query .setParameter("cust_id", 99L);
query .setParameter("cust_name", "盼盼1313");
//注意的是條件查詢處理返回的結果肯定是實體對象.只是數量的不同而已
List<Customer> list = query.list();
for (Customer customer : list) {
System.out.println(customer);
}
============================================================
排序查詢
查詢的語句是 不寫默認升序的哦
form Customer order by 排序的字段 desc (降序) /asc(升序)
===============================================================
案例:
Query query = session.createQuery(" from Customer order by cust_id ");
List <Customer>list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCust_name()+"@"+customer.getCust_id());
}
====================================================================================
分頁查詢.
語句是: 查詢所有的語句 from Customer
注意的是需要設置startIndex 和pageSize;
query.setFirstResult(1);//相當於 startIndex =1
query.setMaxResults(2);//相當於 pageSize=2
===============================================================================
案例:
Query query = session.createQuery(" from Customer ");
query.setFirstResult(1);
query.setMaxResults(2);
List <Customer>list = query.list();
for (Customer customer : list) {
System.out.println(customer.getCust_name()+"@"+customer.getCust_id());
}
=============================================================
1 QBC 查詢方式
我們將它划分為二類.
得到對象 session.creartCriteria
1 字段
1.1 查詢所有 session.creartCriteria(實體對象.class)
=============================================================================================
案例是:
/ 獲得session對象
Session session = HibernateUtils.openSession();
// 通過session獲得查詢對象 criteria
Criteria criteria = session.createCriteria(Customer.class); // 括號里面的參數就是查詢條件了,表示我們查詢的就是這個實體對象.
List<Customer> list = criteria.list(); // 這表示接收返回值.
// 遍歷打印結果
for (Customer customer : list) {
System.out.println(customer);
}
}
=====================================================================================================================
1.2 查詢單個字段
criteria= session.creartCriteria(實體對象.class)
然后賦值
criteria.setProjection(projections.property(變量名);`
返回值是 list<object>
==================================================================================
案例是
Session session = HibernateUtils.openSession();
// 通過session獲得查詢對象 criteria
Criteria criteria = session.createCriteria(Customer.class); // 括號里面的參數就是查詢條件了,表示我們查詢的就是這個實體對象.
// 賦值我們需要查詢的實體的變量名(也就是需要查詢的字段名)
criteria.setProjection(Projections.property("cust_name"));// Projection 投影的意思.
// 查詢后返回的就是Object
List<Object> list = criteria.list(); // 這表示接收返回值.
// 遍歷打印結果
for (Object object : list) {
System.out.println(object);
========================================================================================
1.2 查詢多個字段
查詢的語句是
1 獲得查詢對象
Criteria criteria = session.createCriteria(Customer.class);
2 通過
ProjectionList list2 = Projections.projectionList(); //固定寫法.
3 然后再通過上面得到的集合添加每一個查詢的字段
list2.add(Projections.property("cust_name")); //字段1
list2.add(Projections.property("cust_id")); //字段2
4 然后需要建立查詢字段的集合和查詢對象之間的關系
criteria.setProjection(list2); //固定的寫法哦.其實就是將添加單個字段時的參數替換為集合對象哦.
5 返回的結果是list<object[]>
案例是
=====================================================================================================================================
// 通過session獲得查詢對象 criteria
Criteria criteria = session.createCriteria(Customer.class); // 括號里面的參數就是查詢條件了,表示我們查詢的就是這個實體對象.
// 賦值我們需要查詢的實體的變量名(也就是需要查詢的字段名)
ProjectionList list2 = Projections.projectionList();
list2.add(Projections.property("cust_name"));
list2.add(Projections.property("cust_id"));
// 然后將這個集合與對象建立關系.
criteria.setProjection(list2);
// 查詢后返回的就是Object
List<Object[]> list = criteria.list(); // 這表示接收返回值.
// 遍歷打印結果
for (Object[] object : list) {
System.out.println(Arrays.toString(object));
}
}
===========================================================================================================================================
1.3 聚合函數
查詢語句是 1
1 獲得查詢對象
Criteria criteria = session.createCriteria(Customer.class);
2 添加查詢count
criteria.setProjection(Projections.rowCount()); // 這是相當於count(*)
或者
criteria.setProjection(Projections.count("實體的變量名"));
3 接收返回值
=============================================================================================
案例是
// 獲得session對象
Session session = HibernateUtils.openSession();
// 通過session對象獲得查詢的對象
Criteria criteria = session.createCriteria(Customer.class);
// 准備聚合查詢的條件
criteria.setProjection(Projections.rowCount()); // 這是相當於count(*)
Object result = criteria.uniqueResult(); // 因為聚合查詢出的是唯一的一個結果因此使用此APi這與HQL查詢的相同的.
System.out.println(result);
==========================================================================================================================
1.4 去重函數
// 查詢之去重查詢
public void demo5() {
// 通過工具類獲得session對象
Session session = HibernateUtils.getSession();
// 開啟事物
Transaction transaction = session.beginTransaction();
// 通過session對象獲得criteria對象
Criteria criteria = session.createCriteria(Customer.class);
// 編寫去重的條件
criteria.setProjection(Projections.distinct(Projections.property("cust_name")));
List list = criteria.list();
for (Object object : list) {
System.out.println(object);
}
// 事物的提交
transaction.commit();
1.5 分組查詢
// 通過工具類獲得session對象
Session session = HibernateUtils.getSession();
// 開啟事物
Transaction transaction = session.beginTransaction();
// 通過session對象獲得criteria對象
Criteria criteria = session.createCriteria(Customer.class);
// 賦值開啟分組並且求和
ProjectionList List2 = Projections.projectionList();
List2.add(Projections.groupProperty("cust_name"));
List2.add(Projections.count("cust_name"));
// 將集合與criteria建立關系
criteria.setProjection(List2);
Object result = criteria.uniqueResult();
System.out.println(result);
// 事物的提交
transaction.commit();
}
}
2 條件
條件查詢(單個條件,)
// 2.1 條件查詢 select * from customer where cust_id > 98
@Test
public void demo7(){
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//操作
Criteria criteria = session.createCriteria(Customer.class);
criteria.add(Restrictions.gt("cust_id", 98L));
List<Customer> list = criteria.list()
條件查詢(單]多個個條件,) 操作的對象是 Restrictions 如果是然后可以拼接or或者and
// 2.1 條件查詢
//select * from customer where cust_id > 96 or ( cust_id < 100 and cust_name=盼盼 ) and and and
//criteria.add(Restrictions.gt("cust_id", 96L));
criteria.add(Restrictions.or(
Restrictions.gt("cust_id", 96L),
Restrictions.and(
Restrictions.lt("cust_id", 100L),
Restrictions.eq("cust_name", "盼盼")
)
))
List<Customer> list = criteria.list();
排序查詢
Criteria criteria = session.createCriteria(Customer.class);
criteria.addOrder(Order.desc("cust_id"));
分頁查詢.
Criteria criteria = session.createCriteria(Customer.class)
criteria.setFirstResult(0);
criteria.setMaxResults(2);
非常重要的離線查詢哦
應用場景條件查詢+分頁:
//離線查詢 DetachedCriteria 離線對象(有Criteria所有api 但不具有操作數據庫能力 因為沒有session)
//Criteria 在線對象(有session對象) 直接操作數據庫
//DetachedCriteria 的目的是 在前面servlet層 拼接完參數后 到dao層轉換成在線對象 即可
//封裝一個對象 傳給dao層使用即可
//前置對象
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Customer.class); //里面的參數是告訴它需要查詢的實體對象
detachedCriteria.add(Restrictions.gt("cust_id", 98L)); //拼接參數
//以后的dao層代碼
Session session = HibernateUtils.openSession();
Transaction transaction = session.beginTransaction();
//操作
//將離線對象轉換成在線對象即可操作
Criteria criteria = detachedCriteria.getExecutableCriteria(session); //將session對象給離線對象.並且激活在線對象
List<Object> list = criteria.list(); //然后直接操作了哦.
for (Object object : list) {
System.out.println(object);
}
transaction.commit();
session.close();
}