!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 返回一个 对象

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

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

当我们查询的是数据库中的几个字段,而不是所有字段[投影查询] 默认返回的是一个 数组
[] 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 是面向对象的 所以在门反向映射生成类的时候 就已经帮我们在 文件配置好了一对多的关系;
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对象集合;
查询某些字段的时候
返回的 []数组


数据库中的表 一对一的关系基于主键的
依附的表中没有主键;
在配置 文件中 我们要在
<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 会被关闭无法访问 这时候需要在从方 中设置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属性要注释掉 也要注释diao

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

收藏 打印