本身寫的一個Hibernate的凝乳的封裝
本身在dome一個小項目的時候,突發奇想,利用單例和工廠加上泛型的知識封裝Po的CURD操做,直接上代碼,文筆很差,呵呵,還請你們指教
接口規範,定義凝乳操做
Java的代碼[IMG] http://www.javaeye.com/images/icon_copy.gif [/ IMG]
包edu.sasu.DAO;
進口的java.util.List;
/ **
*全部實體類遵循的接口
* @做者管理員
*
* @參數<T>
* _AT_參數<ID>
* /
公共接口BaseDao <T> {
/ **
*保存實體
* @參數實體的實體類
* /
公共布爾保存(操實體);
/ **
*刪除實體
* @參數實體的實體類
* /
公共布爾刪除(操實體);
/ **
*根據實體的ID刪除實體
* @參數實體的實體類
* /
公共布爾deleteById(操實體);
/ **
*跟新實體
* @參數實體的實體類
* /
/ /公共布爾更新(操實體);
公共布爾更新(操實體,對象的OID);
/ **
*根據實體D,查詢單個實體
* @參數實體的實體類
* @返回
* /
/ /公共ţfindById(操實體);
(操實體,對象entityID),公共ţfindById;
/ **
*累出全部實體集合
* @的參數entityClass實體類
* @返回實體類名單
* /
公共的名單<T>的findAll(絃樂HQL);
公共的名單<T>的findAll(操實體);
/ **
*保存和跟新方法
* /
公共布爾saveOrUpdate(操實體);
}
包edu.sasu.DAO;
進口的java.util.List;
/ **
*全部實體類遵循的接口
* @做者管理員
*
* @參數<T>
* _AT_參數<ID>
* /
公共接口BaseDao <T> {
/ **
*保存實體
* @參數實體的實體類
* /
公共布爾保存(操實體);
/ **
*刪除實體
* @參數實體的實體類
* /
公共布爾刪除(操實體);
/ **
*根據實體的ID刪除實體
* @參數實體的實體類
* /
公共布爾deleteById(操實體);
/ **
*跟新實體
* @參數實體的實體類
* /
/ /公共布爾更新(操實體);
公共布爾更新(操實體,對象的OID);
/ **
*根據實體D,查詢單個實體
* @參數實體的實體類
* @返回
* /
/ /公共ţfindById(操實體);
(操實體,對象entityID),公共ţfindById;
/ **
*累出全部實體集合
* @的參數entityClass實體類
* @返回實體類名單
* /
公共的名單<T>的findAll(絃樂HQL);
公共的名單<T>的findAll(操實體);
/ **
*保存和跟新方法
* /
公共布爾saveOrUpdate(操實體);
}
實現BaseDao接口,實現其中的方法
Java的代碼[IMG] http://www.javaeye.com/images/icon_copy.gif [/ IMG]
包edu.sasu.DAOImpl;
進口了java.io.Serializable;
進口的java.util.ArrayList;
進口的java.util.List;
進口持久性單元對話框;
導入org.hibernate.Session;
導入org.hibernate.Transaction;
導入edu.sasu.DAO.BaseDao;
導入edu.sasu.Util.DBUtil;
/ **
*封裝的基類操做
* @做者管理員
*
* @參數<T>
* /
公共類BaseDAOImpl <T>實現BaseDao <T> {
市民同步布爾刪除(操實體){
/ / TODO自動生成方法存根
返回false;
}
/ **
*刪除某條數據
* /
市民同步布爾deleteById(操實體){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
嘗試{
TX = session.beginTransaction();
使用Session.delete(實體);
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
返回false;
}
返回true;
}
市民同步列表<T>的findAll(操實體){
/ / TODO自動生成方法存根
返回null;
}
/ **
*查找單個數據
* /
市民同步ţfindById(操實體,對象entityID),{
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
ţ溫度;
嘗試{
TX = session.beginTransaction();
TEMP =(T)的session.get(entity.getClass(),(序列化)entityID);
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
投射E;
}最後{
}
返回溫度;
}
/ **
*保存數據
* /
市民同步布爾保存(操實體){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
嘗試{
TX = session.beginTransaction();
/ / session.persist(實體);
的session.save(實體);
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
/ /返回false;
論壇主題貼();
}
返回true;
}
/ **
*跟新數據
* /
市民同步布爾更新(操實體,對象的OID){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
嘗試{
TX = session.beginTransaction();
ţTEMP =(T)的session.get(entity.getClass(),(序列化)的OID);
session.merge(實體)/ /若是更新要拋異常;
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
/ /返回false;
論壇主題貼();
}
返回true;
}
/ **
*查找符合HQL的全部數據
* /
市民同步列表<T>的findAll(絃樂HQL){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
名單<T>列表=新的ArrayList <T>();
嘗試{
TX = session.beginTransaction();
列表= session.createQuery(HQL)名單();
session.flush();
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
論壇主題貼();
}
返回列表;
}
/ **
*保存和跟新方法
* /
市民同步布爾saveOrUpdate(操實體){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
嘗試{
TX = session.beginTransaction();
session.saveOrUpdate(實體);
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
/ /返回false;
論壇主題貼();
}
返回true;
}
}
包edu.sasu.DAOImpl;
進口了java.io.Serializable;
進口的java.util.ArrayList;
進口的java.util.List;
進口持久性單元對話框;
導入org.hibernate.Session;
導入org.hibernate.Transaction;
導入edu.sasu.DAO.BaseDao;
導入edu.sasu.Util.DBUtil;
/ **
*封裝的基類操做
* @做者管理員
*
* @參數<T>
* /
公共類BaseDAOImpl <T>實現BaseDao <T> {
市民同步布爾刪除(操實體){
/ / TODO自動生成方法存根
返回false;
}
/ **
*刪除某條數據
* /
市民同步布爾deleteById(操實體){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
嘗試{
TX = session.beginTransaction();
使用Session.delete(實體);
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
返回false;
}
返回true;
}
市民同步列表<T>的findAll(操實體){
/ / TODO自動生成方法存根
返回null;
}
/ **
*查找單個數據
* /
市民同步ţfindById(操實體,對象entityID),{
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
ţ溫度;
嘗試{
TX = session.beginTransaction();
TEMP =(T)的session.get(entity.getClass(),(序列化)entityID);
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
投射E;
}最後{
}
返回溫度;
}
/ **
*保存數據
* /
市民同步布爾保存(操實體){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
嘗試{
TX = session.beginTransaction();
/ / session.persist(實體);
的session.save(實體);
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
/ /返回false;
論壇主題貼();
}
返回true;
}
/ **
*跟新數據
* /
市民同步布爾更新(操實體,對象的OID){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
嘗試{
TX = session.beginTransaction();
ţTEMP =(T)的session.get(entity.getClass(),(序列化)的OID);
session.merge(實體)/ /若是更新要拋異常;
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
/ /返回false;
論壇主題貼();
}
返回true;
}
/ **
*查找符合HQL的全部數據
* /
市民同步列表<T>的findAll(絃樂HQL){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
名單<T>列表=新的ArrayList <T>();
嘗試{
TX = session.beginTransaction();
列表= session.createQuery(HQL)名單();
session.flush();
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
論壇主題貼();
}
返回列表;
}
/ **
*保存和跟新方法
* /
市民同步布爾saveOrUpdate(操實體){
屆會議DBUtil.getDBUtil()getSession();
交易TX = NULL;
嘗試{
TX = session.beginTransaction();
session.saveOrUpdate(實體);
tx.commit();
}遇上(HibernateException的E){
(TX = NULL){
tx.rollback();
}
/ /返回false;
論壇主題貼();
}
返回true;
}
}
基礎工廠採用單例實現獲取實例操做對象
Java的代碼[IMG] http://www.javaeye.com/images/icon_copy.gif [/ IMG]
包edu.sasu.factory;
導入edu.sasu.DAO.BaseDao;
導入edu.sasu.DAOImpl.BaseDAOImpl;
/ **
*基礎工廠
* @做者管理員
*
* @參數<T>
* /
公共類BaseFactory <T> {
私有靜態BaseFactory baseFactory; / /單一實例
私人BaseDao <T>訟;
的私人BaseFactory(){
實例=,新BaseDAOImpl <T>();
}
公共BaseDao <T>的getInstance(){/ /不要把工廠的新放在構造函數裏面,否則會出現遞歸錯誤
返回實例;
}
公共靜態BaseFactory getFactory(){
(baseFactory == NULL){
baseFactory =新BaseFactory();
}
返回baseFactory;
}
}
包edu.sasu.factory;
導入edu.sasu.DAO.BaseDao;
導入edu.sasu.DAOImpl.BaseDAOImpl;
/ **
*基礎工廠
* @做者管理員
*
* @參數<T>
* /
公共類BaseFactory <T> {
私有靜態BaseFactory baseFactory; / /單一實例
私人BaseDao <T>訟;
的私人BaseFactory(){
實例=,新BaseDAOImpl <T>();
}
公共BaseDao <T>的getInstance(){/ /不要把工廠的新放在構造函數裏面,否則會出現遞歸錯誤
返回實例;
}
公共靜態BaseFactory getFactory(){
(baseFactory == NULL){
baseFactory =新BaseFactory();
}
返回baseFactory;
}
}
以上定義baseDAO接口,baeDAOIMpl什麼接口的實現,baseFactory是工廠,對baseDAOimp實例化,
在類中調用爲:用戶(一個POJO類)
用戶實體=新用戶();
BaseFactory <USER>工廠BaseFactory.getFactory();
執行保存操做。factory.getInstance()保存(實體);實體用戶的實例對象
執行保存操做,請你們評點下此種寫法有什麼很差的地方,本人能力有限,以爲還能夠,請大牛指教
幽默發表於2011年3月24日15時59
0 0請登陸後投票
superobin等級:初級會員
[IMG] [/ IMG] http://www.javaeye.com/images/user-logo.gif?1299226978
性別:[IMG] http://www.javaeye.com/images/icon_minigender_1.gif [/ IMG]
/根據主鍵查詢
公共的對象findRel(類desClass,INT建立者標識){
會話的會話= NULL;
對象obj = NULL;
嘗試{
會議= HibernateUtil.getSession();
OBJ = session.get(desClass,新的整數(建立者標識));
}遇上(HibernateException的E){
論壇主題貼();
}最後{
HibernateUtil.closeSession(會議);
}
返回obj的;
}
Hibernate的條件查詢(標準查詢)
1,建立一個標準實例
net.sf.hibernate.Criteria這個接口表明對一個特定的持久化類的查詢。Session是用來製造Criteria實例的工廠。
標準的暴擊= sess.createCriteria(Cat.class);/ /創建實力類能夠爲OBJECT.CLASS
crit.setMaxResults(50);
名單貓= crit.list();
返回最多50條記錄的結果集。
2,縮小結果集範圍
一個查詢條件(Criterion)是net.sf.hibernate.expression.Criterion接口的一個實例。類net.sf.hibernate.expression.Expression定義了得到一些內置的Criterion類型。
進口org.hibernate.criterion.Projections ;/ /兩個查詢條件類
導入org.hibernate.criterion.Expression;
名單貓= sess.createCriteria(Cat.class)
新增(Expression.like(「名稱」,「弗裏茨%」))
。附加(Expression.between(「重量」,minWeight,maxWeight))
名單();
表達式(表達式)能夠按照邏輯分組。
名單貓= sess.createCriteria(Cat.class)
新增(Expression.like(「名稱」,「弗裏茨%」))
新增(Expression.or(
expression.eq(「年齡」,新的整數(0)),
Expression.isNull(「時代」)
))
名單();
返回(名稱如「弗裏茨%」和年齡等於0或者年齡爲空)的結果集
名單貓= sess.createCriteria(Cat.class)
附加(Expression.in(「名稱」,新的String [] {「弗裏茨」,「IZI」,「PK」}))
新增(Expression.disjunction()
附加(Expression.isNull(「年齡」))
新增(Expression.eq(「年齡」,新的整數(0)))
新增(Expression.eq(「年齡」,新的整數(1)))
新增(Expression.eq(「年齡」,新的整數(2)))
))
名單();
expression.disjunction()----意思什麼能夠按照邏輯分組
有不少預製的條件類型(Expression的子類)。有一個特別有用,可讓你直接嵌入SQL。
名單貓= sess.createCriteria(Cat.class)
新增(Expression.sql(「低像低($ alias.name)(?)」,「弗裏茨%」,Hibernate.STRING))
名單();
其中的{化名}是一個佔位符,它將會被工程學系查詢實體的行別名工程學系替代。(原文:{alias}佔位符被查詢實體的行別名所取代)
3,對結果排序
可使用net.sf.hibernate.expression.Order對結果調集排序。
名單貓= sess.createCriteria(Cat.class)
新增(Expression.like(「名稱」,「F%」)
,。addOrder(Order.asc(「名稱」))
,。addOrder(Order.desc(「年齡」))
setMaxResults(50)
名單();
4,關聯(協會)
你能夠在關聯之間使用createCriteria(),很容易地在存在關係的實體之間指定約束。
名單貓= sess.createCriteria(Cat.class)
新增(Expression.like(「名稱」,「F%」)
個createCriteria(「小貓」。)
新增(Expression.like(「名稱」,「F%」)
名單();
注意,第二個createCriteria()返回一個Criteria的新實例,指向kittens集合類的元素。
下面的替代形式在特定狀況下有用。
名單貓= sess.createCriteria(Cat.class)
。createAlias(「小貓」,「KT」)
。createAlias(「龍虎鬥」,「山」)
新增(Expression.eqProperty(「kt.name」,「mt.name」))
名單();
(createAlias())並不會創建一個標準的新實例。)
請注意,前面兩個查詢中Cat實例所持有的kittens集合類並無經過criteria預先過濾!若是你但願只返回知足條件的kittens,你必須使用returnMaps()。
名單貓= sess.createCriteria(Cat.class)
個createCriteria(「小貓」,「安靜」。)
新增(Expression.eq(「名稱」,「F%」))
,。returnMaps()
名單();
迭代ITER = cats.iterator();
而(iter.hasNext()){
地圖=(地圖)iter.next「();
貓貓(貓)map.get(Criteria.ROOT_ALIAS)的;
貓小貓=(CAT)map.get(「KT」);
}
5,動態關聯對象獲取(動態關聯抓取)
能夠在運行時經過setFetchMode()來改變關聯對象自動獲取的策略。
名單貓= sess.createCriteria(Cat.class)
新增(Expression.like(「名稱」,「弗裏茨%」))
(「龍虎鬥」。setFetchMode,FetchMode.EAGER)
名單();
這個查詢會經過外鏈接(外鏈接)同時得到隊友和小貓。
6,根據範例查詢(例如查詢)
net.sf.hibernate.expression.Example類容許你從指定的實例創造查詢條件。
貓貓貓();
cat.setSex(「F」);
cat.setColor(Color.BLACK);
名單結果= session.createCriteria(Cat.class)
新增(Example.create(CAT))
名單();
版本屬性,表示符屬性和關聯都會被忽略。默認狀況下,null值的屬性也被排除在外。
你能夠調整如何應用爲例。你能夠調整示例(範例)如何應用。
例如例如= Example.create(CAT)
。excludeZeroes()/ /排除零值的屬性
。excludeProperty(「色」)/ /排除一個名爲「色」的屬性
。IGNORECASE()/ /執行區分大小寫字符串比較
enableLike(); / /使用相似字符串比較
名單結果= session.createCriteria(Cat.class)
新增(例如)
名單();
你甚至能夠用示例對關聯對象創建的標準。
名單結果= session.createCriteria(Cat.class)
新增(Example.create(CAT))
個createCriteria(「伴侶」。)
新增(Example.create(cat.getMate()))
名單();
的HQL的多表查詢:
對象之間老是有各類各樣的關係,關聯關係是類之間最多見的關係。多表查詢是HQL中的強大功能之一,
包括內鏈接、左鏈接和右鏈接等。多表查詢的設置及運行都比較麻煩,在運行本節中的示例時,
務必保證每一步都沒有錯誤。
一:表之間的關聯關係:
在數據庫joblog中用到了3個表:student(學生表)、course(課程表)和sc(選課表)。在現實模型中,
一個學生能夠選擇多門課程,一個課程能夠被多個學生選擇,student和course是多對多的關聯關係。
爲了便於演示的HQL的多表查詢,本顯示細大全 - 宜配網假設學生和課程之間什麼單向關聯關係。
在多對多的關聯關係中,通常來講有個中間表,這個表描述了多對多關係,這就是選課表sc,
SC每一行數據表明一個學生的選課和成績。
各個表的主鍵:外鍵設定以下。
學生表的的主鍵什麼的ID字段。
課程表的的主鍵什麼的ID字段。
SC表的的主鍵是ID字段。
SC表中的斯諾字段是學生表的ID字段的:外鍵。
SC表中的CNO字段是課程表的ID字段的:外鍵。
在MySQL的查詢瀏覽器中設定好上述關係。若是此處設定不正確,可能會影響多表鏈接處查詢。
其中SC表的建表信息以下(其中弱者受制與了:外鍵關係)。
建立表「joblog」。「SC」(
'ID'INT(10)無符號的NOT NULL AUTO_INCREMENT的意見'身份證',
「斯諾」INT(10)無符號NOT NULL DEFAULT '0'評論'學號',
「CNO」INT(10)無符號NOT NULL DEFAULT '0'評論'課程號「,
「一級」的詮釋(10)無符號默認爲NULL評論「成績」,
的PRIMARY KEY(「ID」),
鍵'FK_sc_1「(」斯諾「),
關鍵'FK_sc_2「(CNO)
約束'FK_sc_1的外鍵(「斯諾」)參考「學生」(「ID」),/ *:外鍵信息* /
約束'FK_sc_2的FOREIGN KEY(CNO')參考'固然'('ID')/ *:外鍵信息* /
)ENGINE = InnoDB的默認的CHARSET = GB2312;
二:表中的數據:
這一顯示細中用到了3個表的數據
三:修改持久化類:
Student對象和Course對象之間是多對多的關係。此處使用的是單向關聯,僅僅創建從Student到Course的單向關聯。
僅有學生到課的單向關聯。
爲了創建Student到Course的單向關聯關係,在Student.java中新加一個屬性course。course屬性是Set型的,
能夠在這個屬性中加入多個Course對象,創建起關聯關係。下面是加入course屬性後的源代碼,粗體部分爲加入的代碼。
包hibernate.ch06;
進口java.util.HashSet;
進口java.util.Set;
公共類學生實現了java.io.Serializable {
私人整數ID; / /編號
私人整數SNO / /學號
私人字符串SNAME / /姓名;
私人字符串ssex; / /性別
私人的字符串sdept; / /系部
私人整數聖人; / /年齡
私人的字符串saddress; / /住址
私定課程=新的HashSet(); / /所選課程
市民學生(){
}
/ /此處省略其餘的構造方法擴展功能
/ /此處省略getter / setter方法訪問器
/ /課程屬性的獲取訪問器
公共的集getCourse(){
返回過程;
}
/ /課程屬性的集合訪問器
「無效setCourse(課程設置){
this.course =課程;
}
}
持久化類Course.java和SC.java無需修改
在映射文件中加入關聯信息:
在Student.hbm.xml映射配置文件中,加入Student到Course的映射信息。具體代碼以下。
<set name="course" table="sc" lazy="false" cascade="save-update">
<key column="sno"
<many-to-many class="hibernate.ch06.Course" column="cno" />
</集>
說明以下。
<set>元素是和<class>元素平行的元素。<set>元素代表將要映射的字段對應着一個集合。<set>元素包含多個屬性,
其中:name屬性用於設置映射的持久化類的屬性名稱,在本例中爲Student表的course屬性;table屬性表示
多對多關聯關係的中間表名稱,此處爲sc表;cascade表示當保存或者更新Student實例時,是否保存或更新Course對象。
<SET>元素的子元素<key column="sno" />設定與學生表關聯的中間表SC的:外鍵SNO。
<set>元素的子元素<many-to-many>用於設定多對多關係。在該元素中,class屬性用於設定多對多關係中,
與學生類關聯的類課程類;列屬性設定中間表相關的例句課程表鏈接處的:外鍵CNO。
完整的配置文件Student.hbm.xml以下所示。
<?XML版本=「1.0」?>
<的DOCTYPE Hibernate的映射公安!「 - / /休眠/ Hibernate映射的DTD 3.0 / / EN」
「http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd~~V」>
<hibernate-mapping>
<class name="hibernate.ch06.Student" table="student" catalog="joblog">
<ID name="id" type="integer">
<列name="id" />
<generator class="identity"> </發電機>
</ ID>
<! - 映射學號 - >
<property name="sno" type="integer">
<列name="Sno" not-null="true"
</財產>
<! - 映射姓名 - >
<property name="sname" type="string">
<列name="Sname" length="45"
</財產>
<! - 映射系部 - >
<property name="sdept" type="string">
<列name="Sdept" length="10"
</財產>
<! - 映射年齡 - >
<property name="sage" type="integer">
<列name="Sage" />
</財產>
<! - 映射性別 - >
<property name="ssex" type="string">
<列name="Ssex" length="2"
</財產>
<! - 映射住址 - >
<property name="saddress" type="string">
<列name="Saddress" length="45"
</財產>
<! - 聯接 - >
<set name="course" table="sc" lazy="false" cascade="save-update">
<key column="sno"
<many-to-many class="hibernate.ch06.Course" column="cno" < - 多對多 - >
</集>
</類>
</休眠映射>
五:左外鏈接:
左外鏈接(左外鏈接)查詢出左表對應的複合條件的全部記錄,如查詢張三同窗的選課信息。
下面是類HQLLeftOuterJoinQuery的源代碼。
包hibernate.ch06;
進口hibernate.HibernateSessionFactory;
導入java.util.Iterator的;
進口的java.util.List;
導入org.hibernate.Query;
導入org.hibernate.Session;
公共類HQLLeftOuterJoinQuery的{
公共靜態無效的主要(字串[] args){
會話的會話= HibernateSessionFactory.currentSession();
/ /的HQL查詢語句
字符串HQL =「從學生的左加入s.courseçs.sname ='張三'」;
查詢的查詢= session.createQuery(HQL)/ /建立查詢;
的名單= query.list(); / /執行查詢
迭代它= list.iterator();
而(it.hasNext()){
Object []的OBJ =(對象[])it.next();
學生STU = obj的(學生)[0];
固然固然=(課程)obj的[1];
(「*********學生信息及其選課信息******************」);
(course! = NULL){
system.out.println(stu.getSno()「\ t」的stu.getSname()「\ T」
「課程:」course.getCname());
}不然{
system.out.println(stu.getSno()「\ t」的stu.getSname()「\」);
};
}
}
}
若是隻用單表查詢,只能從student表中查詢出張三的我的信息,而沒法知道她的選課信息,由於選課信息存儲在中間表sc中。
的HQL語句從學生小號左加入s.courseçs.sname ='張山'檢索出了長三的選課信息。
在的HQL中使用左外鏈接關鍵字進行左:外鏈接處,外關鍵字能夠省略。
s.course是Student對象中的一個屬性,用來存儲Student對象的選課信息。在執行查詢時,將根據Student.hbm.xml中的
配置生成SQL語句,並檢索信息。
查詢的結果返回一個Object[]數組,數組的第0個元素是Student對象,第1個元素是與Object[0]中對應的學生所選課的Course對象。
HQLLeftOuterJoinQuery類在執行過程當中產生的左:外鏈接處的的SQL語句以下。
冬眠:
選擇
id1_0_ student0_.id
id4_1_ course2_.id
student0_.Sno做爲Sno1_0_
student0_.Sname做爲Sname1_0_
student0_.Sdept做爲Sdept1_0_
student0_.Sage做爲Sage1_0_
student0_.Ssex做爲Ssex1_0_
student0_.Saddress做爲Saddress1_0_
course2_.Cno做爲Cno4_1_
course2_.Cname做爲Cname4_1_
course2_.Ccredit做爲Ccredit4_1_
從
joblog.student student0_
左外鏈接
SC course1_
在student0_.id = course1_.sno
左外鏈接
joblog.course course2_
在course1_.cno = course2_.id
哪裏
student0_.Sname ='張三'
冬眠:
選擇
course0_.sno做爲sno1_
course0_.cno做爲cno1_
id4_0_ course1_.id
course1_.Cno做爲Cno4_0_
course1_.Cname做爲Cname4_0_
course1_.Ccredit做爲Ccredit4_0_
從
SC course0_
左外鏈接
joblog.course course1_
在course0_.cno = course1_.id
哪裏
course0_.sno =?
使用以下語句將只返回學生對象。
從學生的左加入s.course C,其中s.sname ='張三'選擇小號
以下是隻返回學生對象的部分代碼。
會話的會話= HibernateSessionFactory.currentSession();
/ /的HQL查詢語句
字符串HQL =「選擇S從學生小號左加入s.courseçs.sname ='張三'」;
查詢的查詢= session.createQuery(HQL)/ /建立查詢;
的名單= query.list(); / /執行查詢
迭代它= list.iterator();
而(it.hasNext()){
學生STU(學生)it.next「,();
(「*********學生信息及其選課信息******************」);
system.out.println(stu.getSno()「\ t」的stu.getSname()「\」);
}
六:左外抓取鏈接:
左外抓取鏈接指定在Hibernate檢索數據時,採用抓取的方式,直接將數據加載到與Student對象關聯的course屬性中。
下面是左外抓取鏈接的程序。
/ /的HQL查詢語句
字符串HQL =「選擇S從學生的左join fetch的s.courseçs.sname ='張三'」;
查詢的查詢= session.createQuery(HQL)/ /建立查詢;
的名單= query.list(); / /執行查詢
迭代它= list.iterator();
而(it.hasNext()){
學生STU(學生)it.next「,();
(「*********學生信息及其選課信息******************」);
system.out.println(stu.getSno()「\ t」的stu.getSname()「\」);
}
左:外抓取鏈接處使用左join fetch的關鍵字。
與左外鏈接不一樣的是:左外抓取鏈接query.list()返回的集合中存放Student對象的引用,
與之相關聯的選課信息存放在課程屬性大全 - 宜配網。
七:右外鏈接:
HQL的大全 - 宜配網使用關鍵字右外部聯接售後服務:外鏈接處,外關鍵字能夠省略。售後服務:外鏈接處相關的例句左:外鏈接處相似,再也不贅述。
八:內鏈接:
內鏈接(內蒙古
HQL的大全 - 宜配網使用關鍵字內部聯接進行內鏈接處,下面什麼使用內鏈接處的程序。
會話的會話= HibernateSessionFactory.currentSession()/ /建立會議
HQL =字符串「從學生小號內加入s.course C」/ /的HQL查詢語句
查詢的查詢= session.createQuery(HQL)/ /建立查詢;
的名單= query.list(); / /執行查詢
迭代它= list.iterator();
而(it.hasNext()){
Object []的OBJ =(對象[])it.next();
學生STU = obj的(學生)[0];
固然固然=(課程)obj的[1];
(「*********學生信息及其選課信息******************」);
system.out.println(stu.getSno()「\ t」的stu.getSname()「\ t」的「課程:」的固然getCname());
}
HQL的大全 - 宜配網使用內
可使用選擇S從學生的內在聯接s.courseç只返回學生對象。
九:抓取內鏈接:
抓取內鏈接與內鏈接不一樣之處在於其對象的內存狀態不同。的HQL中使用內部聯接取進行抓取內鏈接處,以下程序,所示。
會話的會話HibernateSessionFactory.currentSession =()/ /建立會議
HQL =「選擇S從學生的內在join fetch的s.courseç」/ /的HQL語句
查詢的查詢= session.createQuery(HQL)/ /建立查詢;
的名單= query.list(); / /執行查詢
迭代它= list.iterator();
而(it.hasNext()){
學生STU(學生)it.next「,();
(「*********學生信息及其選課信息******************」);
system.out.println(stu.getSno()「\ t」的stu.getSname()「\」);
}
內抓取鏈接處使用內部聯接fech關鍵字。
它與內鏈接的區別是返回檢索的list中存放的是Student對象的引用,與之相關聯的選課信息存放在course屬性中