笔记:Hibernate SQL 查询
Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQL查询也支持将SQL语句放在配置文件中配置,从而提高程序的解耦,命名SQL查询还可以用于调用存储过程。
SQL查询是通过SQLQuery接口来表示的,SQLQuery接口是Query接口的子接口,完全可以使用Query接口的方法,SQLQuery增加了二个重载方法
- addEntity():将查询到的记录与特定的实体关联
- addScalar():江查询的记录关联标量值
执行SQL的步骤如下:
- 获取Hibernate Session对象
- 编写SQL语句
- 创建SQLQuery对象,调用Session的createSQLQuery方法创建
- 调用SQLQuery对象的 addScalar 或者 addEntity 方法将选出的结果与变量值或实体进行关联
- 如果SQL语句包含参数,则调用Query的setXxx方法为参数赋值
- 调用Query的list、uniqueResult方法返回查询的结果集
- 标量查询
如果希望仅仅让Hibernate选出某个字段的值,则可以使用标量查询,通过addScalar方法指定返回的字段值,示例如下:
List list = curSession.createSQLQuery("select * FROM OneToMany_One")
.addScalar("Total_Trade_Amt", StandardBasicTypes.LONG)
.list();
- 实体查询
如果查询了某个数据表的全部数据列,且该数据表有对应的持久化类映射,可以通过 addEntity 指定持久化类型,将查询结果转换为实体,示例如下:
List list = curSession.createSQLQuery("select * FROM OneToMany_One")
.addEntity(OneToManyForOneModel.class)
.list();
- SQL参数
SQL语句可以使用二种参数定义方式,参数Key和参数索引的方式
- 参数Key方式:在SQL语句中使用":参数名称"的方式定义参数,并使用 setParameter方法的参数名称来给参数赋值,并制定参数的类型,示例如下:
List list = curSession.createSQLQuery("select * FROM OneToMany_One WHERE Record_ID = :reocrdId")
.addEntity(OneToManyForOneModel.class)
.setParameter("reocrdId", 1234, StandardBasicTypes.INTEGER)
.list();
- 参数索引方式:在SQL语句中使用"?"来定义参数,并使用setParameter方法的索引重载来给参数赋值,并制定参数的类型,示例如下:
List list = curSession.createSQLQuery("select * FROM OneToMany_One WHERE Record_ID = ?")
.addEntity(OneToManyForOneModel.class)
.setParameter(0, 1234, StandardBasicTypes.INTEGER)
.list();
- 存储过程
Hibernate 当前仅支持存储过程返回标量和实体,调用存储过程还有如下需求注意的地方:
- 建议采用标准SQL92语法,如{?=call functionName(<parameters>)} 或 {call procedureName(<parameters>)},不支持原生的调用语法。
- 调用存储过程进的查询无法使用setFirstResult()、setMaxResults()进行分页
- 定制化SQL,Hibernate 需要保存、更新和删除持久化实体时,默认通过一套固定的SQL语句来完成这些功能,如果程序需要改变这套默认的SQL语句,就可以使用Hibernate所提供的定制SQL功能,
- 注解 @SQLInsert 定制插入记录的SQL语句;
- 注解 @SQLUpdate:定制更新记录的SQL语句;
- 注解 @SQLDelete:定制删除记录的SQL语句;
- 注解 @SQLDeleteAll:定制删除所有记录的SQL语句;
- 注解@Loader:定制查询的SQL语句
他们都有二个参数,其参数sql 表示执行的定制SQL语句(存储过程),参数 callable 表示该语句是否为存储过程。如果使用存储过程时,参数的顺序很重要,可以将 org.hibernate.persister.entity 日志级别设置为 debug级别,从而允许查看Hibernate所期待的顺序,整个级别下,Hibernate将会输出 create、update和delete实体的静态SQL。因为Hibernate 会检查SQL语句是否执行成功,所以应该让存储过程能返回该存储过程影响的记录行数,Hibernate通常把CUD操作语句的第一个参数注册为数值型输出参数,所以应该让存储过程的第一个参数记录该存储过程所影响的记录条数(存储过程没有测试成功)
笔记:Hibernate SQL 查询的更多相关文章
- atitit。 hb Hibernate sql 查询使用
atitit. hb Hibernate sql 查询使用 #----------返回list<map>法..这个推荐使用. q.setResultTransformer(Tr ...
- hibernate sql查询转换成VO返回list
hibernate sql查询转换成VO @Override public List<FenxiVo> getTuanDuiFenxiList(FenxiVo FenxiVo,Intege ...
- 感恩笔记之SQL查询功能最简使用模板
感恩笔记之SQL查询功能最简使用模板 第一部分:SQL单表功能 1 语句主要关键字 SELECT --查询数据列 INTO --新建数据表 FROM --查询数据表 WHERE --筛选数据表结果 O ...
- Hibernate SQL查询 addScalar()或addEntity()
本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原 ...
- hibernate sql查询
如果你跟我一样比较熟悉SQL,同时不想学习一门新的语言.那么在hibernate中使用Native SQL 查询也是一种不错的方式. 一方面,Native SQL在效率方面有天生的优势: 另一方面,S ...
- hibernate sql查询后对象转换成实体类
在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用 session.createSQLQuery(sql).setResultTransform ...
- Hibernate SQL查询 addScalar()或addEntity()【转】
本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询. 对原 ...
- Hibernate SQL 查询
本文转载自:https://www.cnblogs.com/li3807/p/6358386.html Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQ ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
随机推荐
- Sparklyr与Docker的推荐系统实战
作者:Harry Zhu 链接:https://zhuanlan.zhihu.com/p/21574497 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 相关内容: ...
- java重写和重载
方法的重载: 在一个类中的两个或两个以上的方法,他们方法名相同但是参数列表不同,这种方式称为方法的重载,方法的重载是实现多态性的方式之一. 参数列表不同指的是参数的个数不同或相同的个数但顺序不同或者类 ...
- JavaWeb中jdbcproperties配置文件
开发中使用properties配置文件,方便后期维护. 文件位置: 任意,建议src下 文件名称:任意,扩展名为properties 文件内容:一行一组数据,格式“key=value” key 命名自 ...
- es6的新特性--模板字符串
这几天简单看了一下深入浅出es6这本书,感觉特实用,学习了一个新特性---模板字符串在项目开发中,拼接字符串是不可缺少的,动态创建dom元素以及js操作数据都要拼接字符串,在es6出来之前,我们都通常 ...
- iOS - Mac 常用快捷键
前言 可以按下组合键来实现通常需要鼠标.触控板或其他输入设备才能完成的操作. 要使用键盘快捷键,需按住一个或多个修饰键,同时按快捷键的最后一个键.例如,要使用快捷键 Command-C(拷贝),请按住 ...
- 手机端仿ios的三级联动脚本四
二,脚本 <script> $("#city-picker").cityPicker({ title: "选择省市区/县", onChange: f ...
- 初入前端框架bootstrap--Web前端
Bootstraps是一种简洁.直观.强悍的前端开发框架,它让web开发更迅速.简单.对于初入Bootstrap的小白,高效进入主题很重要,能为我们节省很多时间,下面我将对使用Bootstrap开发前 ...
- RobotFramework自动化测试框架-移动手机自动化测试Open Application关键字的使用
在AppiumLibrary库中,Open Application关键字用来打开一个待测试移动APP. 示例1:连接本机已经打开的appium服务端,打开一个待测试的安卓APP,指定测试平台为Andr ...
- mybatis快速入门(四)
mybatis动态标签<where><if><foreach>以及sql片段 1.创建一个包装类UserQueryVo.java package cn.my.myb ...
- 【SPOJ】Distinct Substrings(后缀自动机)
[SPOJ]Distinct Substrings(后缀自动机) 题面 Vjudge 题意:求一个串的不同子串的数量 题解 对于这个串构建后缀自动机之后 我们知道每个串出现的次数就是\(right/e ...