hibernate 學習筆記(2)——HQL和高級查詢

hib 4.3 實體映射文件xml 中地址末尾的空格要去掉,在Myeclipse10中。

表之間的關聯關係:()先不自動添加表間關聯關係

1、一對多:one to many 

grade 一方 =》多個學生

private Set<> ... = new HashSet<>();

xml:
<set name="..." >

<key column="gid"/>

<one-to-many class="...實體類" />

</set>

單向關聯:只有設置的一方能得到另一方的信息

2、多對一:many to one

<many-to-one name="grade" class="..." column=""GID">

雙向關聯:級聯操作  雙方都進行了設置,使得雙方都能夠從自身看到對方的信息

ERROR1:TransientObjectException

在一所在方的<set>中添加casade="save-update"

ERROR2:TypeMismatchException 

對象類型錯誤


級聯刪除:  設置cascade="delete"

在一所在方:<set> 內設置cascade="delete" inverse="true" 

其中inverse屬性設置爲true時將刪除的控制權限給予對方進行維護,false時自己維護


在一所在方<set>內設置cascade="all"後,即可實現級連的添加、刪除、修改。


在實際開發中,並非所有的關聯關係都適合使用雙向關聯,是不同的需求設定,如:加載租房信息時獲得街道信息;反之,並不是很重要。


一對一:
<one-to-one name="..." class="...">或者

<many-to-one unique="true"/>

未設置cascade屬性會使一表有數據一表爲空

所以one-to-one cascade="all"


多對多:

 <!-- many to many  table:第三張表名-->
        <set name="teacherms" table="teacherm_studentm">
         <key column="msid"/> <!-- 當前學生表的 (第三張表)FK msid -->
         <!--第三張表中的Fk: column="mtid" -->
         <many-to-many class="com.hlx.manytomany.Teacherm" column="mtid"/>
        </set>

 <!-- many to many  inverse="true"控制維護; cascade="all" 級聯操作 -->
        <set name="studentms" table="teacherm_studentm" inverse="true" cascade="all">
         <key column="mtid"/><!-- 當前老師表的 (第三張表)FK mtid -->
         <!--第三張表中的Fk: column="msid" -->
         <many-to-many class="com.hlx.manytomany.Studentm" column="msid"/>
        </set>


Hibernate 檢索方式:

HQL(hibernate Query Language)

是面向對象的查詢語言

[select ...] from Entity(類名或屬性名區分大小寫)[where ...] [group by ...]


String hql="from Dept";

List<> list = session.createQuery(hql).list();

hql="from Dept where ..." 

hql="select ... from Dept"(部分查詢)

hql="select did,dname from Dept"(執行後取出的值爲Object數組)


參數綁定:

1、通過?設置參數:

hql="from Dept where deptno>? and ... ?"

List<> list = session.createQuery(hql).setParameter(0,10).setParameter(1,"").list();

進行設置問號的參數值

2、通過別名設置參數:

:dno

hql="from Dept where deptno>:dno and ... ";

session.createQuery(hql).setParameter("dno",10).list();

進行設置通過別名的參數值


排序、統計函數、分組函數

order by 

group by ... having...

select count(0) from Emp;

使用createQuery(hql).uniqueResult();設置單一值或null


分頁:

//設置第一條記錄的位置

createQuery(hql).setFirstResult((pageIndex-1)*pageSize);

//設置最大返回的記錄條數

createQuery(hql).setMaxResults(pageSize);


左外連接:

表名1 left outer join 表名2 on 條件

String hql="from Emp e left join e.dept d where d.dname='sss'";


右外連接:

String hql="from Emp e (obj[0])right join e.dept(obj[1])";


內連接:

String hql ="from Emp e inner join e.dept";


都會返回多個對象。所以到時候獲取數據需要通過object數組進行。


左外抓取連接(迫切連接): 返回一個主要對象

String hql="from Emp e left join fetch e.dept"

List<Emp> list=session.createQuery(hql).list();


查詢部門中沒有員工的部門:

String hql="from Dept d where d.deptno not in (select e.dept.deptno from Emp)";


連接類型                 HQL語法

內連接                      inner join / join

迫切內連接              inner join fetch / join fetch

左外連接                  left outer join / left join

迫切左外連接          left outer join fetch / left join fetch

右外連接                  right outer join / riget join




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章