Hibernate的數據庫查詢操作

一、對錶中的所有的數據進行查詢,不可以使用select * 子句,直接使用from 對象的形式進行查詢
/**
* 查詢所有User
* @return List結果集合
*/
public List<User> findUser(){
Session session = null; //聲明Session對象
List<User> list = null;
try {
//獲取Session
session = HibernateUtil.getSession();
session.beginTransaction(); //開啓事務
String hql = "from User "; //HQL語句,User是持久化類
//創建Query對象
Query query = session.createQuery(hql);
list = query.list(); //獲取查詢結果集
//提交事務
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//出錯將回滾事務
session.getTransaction().rollback();
}finally{
//關閉Session對象
HibernateUtil.closeSession();
}
return list;
}
二、查詢一部分字段
String hql = "select new User(id,name) from User "; //HQL語句,User是持久化類
查詢出id,name並實例化爲User對象

三、條件查詢
String hql = "from User uwhere u.id=1 "; //HQL語句,User是持久化類
查詢id爲1的數據。u爲 一個對象

四、使用?代替參數
String hql = "from User uwhere u.id=?"; //HQL語句,User是持久化類
Query query = session.createQuery(hql);
query=query.setParameter(0,4);=//從0開始的,代表第一個問號,設置參數爲4,即id=4

五、對象導航查詢
Session session = null; //聲明Session對象
//開啓第一個session
try {
//獲取Session
session = HibernateUtil.getSession();
//開啓事務
session.beginTransaction();
//HQL查詢語句
String hql = "from Medicine m wherem.category.name = ?";
//之所以是m.category.name是因爲持久化對象Medicine中有一個屬性是持久化 對象Category
//創建Query對象並對HQL動態賦值
Query query = session.createQuery(hql)
.setParameter(0, "感冒用藥");

//獲取查詢結果集
List<Medicine> list = query.list();
response.setCharacterEncoding("GBK");
PrintWriter out=response.getWriter();
//循環輸出類別"感冒用藥"中的藥品名稱
for(Medicine m : list){
out.println("感冒用藥: " + m.getName()+"<br>");
}
out.flush();
out.close();
//提交事務
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//出錯將回滾事務
session.getTransaction().rollback();
}finally{
//關閉Session對象
HibernateUtil.closeSession();
}

六、排序查詢
from User u order by u.id asc//升序
from User u order by u.id desc//降序

七、聚合函數查詢
在HQL查詢語言中,支持常用的聚合函數的使用,比如 Sum,min,max,count等等,其使用的方法和SQL語句基本相同

select count(*) from User u//查詢User對象所對應的數據表中的記錄數
select max(u.id) from User u//查詢User對象所對應表中最大的id值

八、分組操作
通常使用group by子句進行分組操作,也可搭配having子句
//獲取Session
Session session = HibernateUtil.getSession();
session.beginTransaction(); //開啓事務
//HQL語句,通過部門進行分組查詢
String hql = "selectu.dept,count(*) from User ugroup by u.dept";
//創建Query對象
Query query = session.createQuery(hql);
//獲取結果集
List<Object[]> list = query.list();
//循環輸出部門名稱及人數
for (Object[] obj : list) {
System.out.print("部門: " + obj[0] + "---");
System.out.println("人數: " + obj[1]);
}
//提交事務
session.getTransaction().commit();

九、對時間進行查詢
可以使用等號=進行時間的精確匹配,也可以使用between.. and子句查詢指定的時間範圍,也可以使用date_format()函數進行時間的模糊查詢。
//獲取Session
Session session = HibernateUtil.getSession();
session.beginTransaction(); //開啓事務
//HQL語句
String hql = "from User u where date_format(u.birth,'%Y-%m') = ?";
//創建Query對象
Query query = session.createQuery(hql)
.setParameter(0, "1984-01");
//獲取結果集
List<User> list = query.list();
System.out.println("1984年1月出生的用戶有:");
//循環輸出1984年1月出生的用戶姓名及出生日期
for (User user : list) {
System.out.print("姓名: " + user.getName() + "\t");
System.out.println("出生日期: " + user.getBirth());
}
//提交事務
session.getTransaction().commit();

十、聯合查詢
關於連接的詳細解釋
一般使用內連接
1、 查兩表關聯列相等的數據用內連接。
2、 Col_L是Col_R的子集時用右外連接。
3、 Col_R是Col_L的子集時用左外連接。
4、 Col_R和Col_L彼此有交集但彼此互不爲子集時候用全外。
5、 求差操作的時候用聯合查詢。
Session session = null; //聲明Session對象
List<Object[]> list = null;
try {
//獲取Session
session = HibernateUtil.getSession();
//開啓事務
session.beginTransaction();
//HQL查詢語句
String hql = "select m.id,m.name,m.price,m.factoryAdd,c.name from Medicine minner join m.category c";
//創建Query對象並獲取結果集
list = session.createQuery(hql)
.list();
//提交事務
session.getTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
//出錯將回滾事務
session.getTransaction().rollback();
} finally {
//關閉Session對象
HibernateUtil.closeSession();
}

十一、子查詢
// HQL語句
String hql = "select med.name from Medicine medwheremed.price = (select max(price) from Medicine)";
先查詢藥品中價格最貴的,並找到其名稱

以上內容參考至《JavaWeb開發實戰》
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章