基本數據查詢

使用Hibernate進行數據查詢是一件簡單的事,Java程序設計人員可以使用對象操作的方式來進行數據查詢,查詢時使用一種類似SQL的HQL(Hibernate Query Language)來設定查詢的條件,與SQL不同的是,HQL是具備對象的繼承、多態等特性的語言。
直接使用範例來看看如何使用Hibernate進行數據庫查詢
查詢數據時,我們所使用的是Session的find()方法,並在其中指定HQL設定查詢條件,查詢的結果會裝載在List對象中傳回,您所需要的是將它們一一取出,一個最簡單的例子如下:
代碼:
package com.xtedu.teach.common;
import org.hibernate.Session;
import org.hibernate.Transaction;
import com.xtedu.teach.hibernate.mappings.User;
import java.util.*;
public class HibernateTest {
public static void main(String[] args) throws HibernateException {
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
Session session = sessionFactory.openSession();
List users = session.find("from User");
session.close();
sessionFactory.close();
for (ListIterator iterator = users.listIterator(); iterator.hasNext(); ) {
User user = (User) iterator.next();
System.out.println(user.getName() +
"\n\tAge: " + user.getAge() +
"\n\tSex: " + user.getSex());
}
}
}


find()中的"from User"即HQL,User指的是User類,藉由映射文件,它將會查詢USER
表中的數據,相當於SQL中的SELECT * FROM USER,實際上我們的User類是位於com.xtedu.teach.hibernate.mappings下,Hibernate會自動看看import中的package名稱與類名稱是否符合,您也可以直接指定package名稱,例如:
代碼:
session.find("from com.xtedu.teach.hibernate.mappings.User");


這個程序的運行結果可能是這樣的:
代碼:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select user0_.user_id as user_id, user0_.name as name, user0_.sex as sex, user0_.age as age from USER user0_
caterpillar
Age: 28
Sex: M
momor
Age: 25
Sex: F
Bush
Age: 25
Sex: M
Becky
Age: 35
Sex: F


上面所介紹的查詢是最簡單的,只是從數據表中查詢所有的數據,Hibernate所查詢返回的數據,是以對象的方式傳回,以符合程序中操作的需要,我們也可以限定一些查詢條件,並只傳回我們指定的列,例如:
代碼:
List names = session.find("select user.name from User as user where age = 25");
for (ListIterator iterator = names.listIterator(); iterator.hasNext(); ) {
String name = (String) iterator.next();
System.out.println("name: " + name);
}


在find()中的HQL示範了條件限定的查詢,User as user爲User類取了別名,所以我們就可以使用user.name來指定表傳回列,where相當於SQL中的WHERE子句,我們限定查詢age等於25的數據,這次查詢的數據只有一個欄位,而類型是String,所以傳回的List內容都是String對象,一個運行的例子如下:
代碼:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select user0_.name as x0_0_ from USER user0_ where (age=25 )
name: momor
name: Bush


如果要傳回兩個以上的列,也不是什麼問題,直接來看個例子:
代碼:
List results = session.find("select user.name, user.age from User as user where sex = 'F'");
for (ListIterator iterator = results.listIterator(); iterator.hasNext(); ) {
Object[] rows = (Object[]) iterator.next();
String name = (String) rows[0];
Integer age = (Integer) rows[1];
System.out.println("name: " + name + "\n\t" + age);
}


從上面的程序中不難看出,傳回兩個以上列時,每一次ListIterator會以Object數組的方式傳回一筆數據,我們只要指定數組索引,並轉換爲適當的類型,即可載入數據,一個查詢的結果如下:
代碼:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select user0_.name as x0_0_, user0_.age as x1_0_ from USER user0_ where (sex='F' )
name: momor
25
name: Becky
List results = session.find("select count(*), avg(user.age) from User as user");
ListIterator iterator = results.listIterator();
Object[] rows = (Object[]) iterator.next();
System.out.println("數據筆數: " + rows[0] + "\n平均年齡: " + rows[1]);

35



您也可以在HQL中使用一些函數來進行結果統計,例如:
代碼:

一個查詢的結果如下所示:
代碼:
log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment).
log4j:WARN Please initialize the log4j system properly.
Hibernate: select count(*) as x0_0_, avg(user0_.age) as x1_0_ from USER user0_
數據筆數: 4
平均年齡: 28.25

發佈了33 篇原創文章 · 獲贊 1 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章