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