hibernate 学习笔记(2)——HQL和高级查询

来源:互联网 发布:mac mini u盘重装系统 编辑:程序博客网 时间:2024/06/06 05:02

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




0 0