hibernate 中的查询方式?

!hibernate 中的查询方式?

Java开发交流群 677807540   大家可以一起讨论技术欢迎加入

OID 查询 get(Student.class,id)
HQL
QBC
SQL

如果在通过反射反向创建对象,
对象没有主键 会生成对应名字加Id的类 这里面存放着所有的属性.可以  同过类.id.属性获得属性值;
Hibernate Query Language
HQL是面向对象的查询语言,在HQL中查询的类是 类中的属型
而不是表 表中字段,底层Hibernate会翻译成对应的SQL语句查询表,但是在Hibernate中必须写的是面向对象的查询;
HQL中的类必须大写和你生成的类名要一致
* 在查询的列表中不能出现* 要给对象的类起别名 ; 在count(*) 可以出现在这里,* 不能单独的出现
HQL中可以传参 参数的个数没限制 同过query.setString(0,参数);  如果知道返回一个结果,可以使用uniqueResult 返回一个Object对象

Hibernate是如何分页的?
hibernate 使用底层数据库的分页语句,如果底层使用的是mysql数据库,则bibernate使用limit分页,如果底层使用的是
oracle数据库,则hibernate是用rownum进行分页,hibernate将分页操作封装在了响应的方法中,我们只需要调用方法,不需要关注底层sql实现细节;

查询出来的结果 .query.setFisrtResult(起始索引值) query.setMaxResult(最大显示多少条记录);

当我们查询的是数据库中的几个字段,而不是所有字段[投影查询] 默认返回的是一个object数组
Object[] data = query.list(); System.out.ptintln(data[0]+"\t"+data[1]);
页可以通过 "select new Map(e.ename.e.sal) feom Emp e";
这样返回的就是一个Map类型的集合 遍历集合通过get("0")>>>get(key) 拿取对应的值
复杂的连表查询
"select new Map(e.ename,e.sal,d.dname,d.deptbo,sg.id.grade,sg.id.losal,sg.id.hisal) "
+" from  Emp e ,Dept d ,Salgrade sg where e.dept.deptno =d.deptno and e.sal between sg.id.losal and sg.id.hisal and e.sal >2000"
查询了三个表中的部分字段 通过员工表的部门id和部门表中的部门id 和 员工表中的工资介于工资表中的范围 将三个表联立; 这里面 deptno 和 deptno 可以约掉; 工资表是没有主键的所以通过反向映射 hibernate帮助生成主键id这个类,这个类中有你所有属性; 最后的一个条件的过滤;

实际上我们可以简便的写这个查询语句;
因为hibernate 是面向对象的 所以在门反向映射生成类的时候 就已经帮我们在xml文件配置好了一对多的关系;
Emp这个类中已经有我们需要的部门的对象,这是面向对象的思想;
所以我们可以 通过e.dept.dname获得部门的名字;

QBC
Query By Criteria(标准)
Criteria cri = session.createCriteria(Emp.class);
普同条件 可以通过cri.add(Restrictions.eq("字段",值)).||类似的方法有le lt ge gt between (like% 值%) in
分页通过cri.setFirstResult() cri.setMaxResults();
组函数通过 count(); sum(); max() min() avg()
cri.setProjection(Projections.avg("字段"));

SQL
创建SQLQuery query = session.createSQLQuery();
query.list(); 
查询所有字段的时候 ;
我们可以指定返回对象的类型;query.addEntity(Emp.class);
这样我们得到的就是Emp对象集合;
查询某些字段的时候
返回的Object[]数组


数据库中的表 一对一的关系基于主键的
依附的表中没有主键;
在配置xml 文件中 我们要在
<column name ="id">
这下面
<generator class="foreign">
    其实下面就是一个类 ca.setId(ca.getCo().getId()) 拿取主键的id 设置为自己的id
    <param name="property">与下面的一对一种的name属性 相对应</param>
</generator>
<one-to-one name="co属性值一致" lazy="在使用从查主的时候这里不设置会报no session 异常" 
class="com.etoak.po.Country" cascade="save-update" 互相更新 
constrained="true" 表示有其他属性引用co属性></one-to-one>

设置主键中的配置文件;
<one-to-one name="ca" class="com.etoak.po.Capital" cascade="save-update" ></one-to-one>
name:表示属性的名字 class 属性的类型
cascade:表示级联关系,即操作当前对象的时候,是否会对对方产生影响;
save-update:表示保存或者更新当前对象的时候级联保存或者更新对方;
all:所有情况都联级 delete:删除的时候联级
none:不联级

在一堆多的关系中,查询主方会立即将从方数据取出
查询从方不会拿取主方 而且session 会被关闭无法访问 这时候需要在从方xml中设置lazy="false" 就可以拿到了
有俩种添加方式
1.主方添加从方
从方添加主方
保存主方
2从方添加主方 住房会被自动添加
保存从方


one - to  -many


在one 中设置 
name:类中的emps属性 
column:对应表中的did字段
class:对应表对应实体类所在位置;
inverse:表示关联字段的维护权是否反转,是否交给对方生成关联字段的值 默认是false 不反转;
(这样可能会提高效率)
lazy:是否懒;如果是false 则查询本表会将关联的页查询,我们就可以访问了
<set name="emps" inverse="true" lazy="false" cascade="save-update">
            <key column ="did"  ></key>
             <one-to-many class="com.etoak.po.Emp"/> 
</set>


在many中设置
原来制动生成did属性要注释掉 xml也要注释diao

 <many-to-one name="dept" class="com.etoak.po.Dept" >
            <column name="did"></column>
 </many-to-one>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值