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>
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