本文转载自:https://www.cnblogs.com/li3807/p/6358386.html

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方法返回查询的结果集
  1. 标量查询

    如果希望仅仅让Hibernate选出某个字段的值,则可以使用标量查询,通过addScalar方法指定返回的字段值,示例如下:

    List list = curSession.createSQLQuery("select * FROM OneToMany_One")
    
    .addScalar("Total_Trade_Amt", StandardBasicTypes.LONG)
    
    .list();
  2. 实体查询

    如果查询了某个数据表的全部数据列,且该数据表有对应的持久化类映射,可以通过 addEntity 指定持久化类型,将查询结果转换为实体,示例如下:

    List list = curSession.createSQLQuery("select * FROM OneToMany_One")
    
    .addEntity(OneToManyForOneModel.class)
    
    .list();
  3. 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();
  1. 存储过程

    Hibernate 当前仅支持存储过程返回标量和实体,调用存储过程还有如下需求注意的地方:

  • 建议采用标准SQL92语法,如{?=call functionName(<parameters>)} 或 {call procedureName(<parameters>)},不支持原生的调用语法。
  • 调用存储过程进的查询无法使用setFirstResult()、setMaxResults()进行分页
  1. 定制化SQL,Hibernate 需要保存、更新和删除持久化实体时,默认通过一套固定的SQL语句来完成这些功能,如果程序需要改变这套默认的SQL语句,就可以使用Hibernate所提供的定制SQL功能,
    1. 注解 @SQLInsert 定制插入记录的SQL语句;
    2. 注解 @SQLUpdate:定制更新记录的SQL语句;
    3. 注解 @SQLDelete:定制删除记录的SQL语句;
    4. 注解 @SQLDeleteAll:定制删除所有记录的SQL语句;
    5. 注解@Loader:定制查询的SQL语句

    他们都有二个参数,其参数sql 表示执行的定制SQL语句(存储过程),参数 callable 表示该语句是否为存储过程。如果使用存储过程时,参数的顺序很重要,可以将 org.hibernate.persister.entity 日志级别设置为 debug级别,从而允许查看Hibernate所期待的顺序,整个级别下,Hibernate将会输出 create、update和delete实体的静态SQL。因为Hibernate 会检查SQL语句是否执行成功,所以应该让存储过程能返回该存储过程影响的记录行数,Hibernate通常把CUD操作语句的第一个参数注册为数值型输出参数,所以应该让存储过程的第一个参数记录该存储过程所影响的记录条数(存储过程没有测试成功)

Hibernate SQL 查询的更多相关文章

  1. atitit。 hb Hibernate sql 查询使用

    atitit. hb  Hibernate sql 查询使用 #----------返回list<map>法..这个推荐使用.      q.setResultTransformer(Tr ...

  2. hibernate sql查询转换成VO返回list

    hibernate sql查询转换成VO @Override public List<FenxiVo> getTuanDuiFenxiList(FenxiVo FenxiVo,Intege ...

  3. Hibernate SQL查询 addScalar()或addEntity()

    本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询.          对原 ...

  4. hibernate sql查询

    如果你跟我一样比较熟悉SQL,同时不想学习一门新的语言.那么在hibernate中使用Native SQL 查询也是一种不错的方式. 一方面,Native SQL在效率方面有天生的优势: 另一方面,S ...

  5. hibernate sql查询后对象转换成实体类

    在多表查询的时候使用hibernate的sql查询的时候,一般返回的是object[]数组,或者可以使用  session.createSQLQuery(sql).setResultTransform ...

  6. 笔记:Hibernate SQL 查询

    Hibernate 支持使用原生的SQL查询,使用原生SQL查询可以利用某些数据库特性,原生SQL查询也支持将SQL语句放在配置文件中配置,从而提高程序的解耦,命名SQL查询还可以用于调用存储过程. ...

  7. Hibernate SQL查询 addScalar()或addEntity()【转】

    本文完全引用自: http://www.cnblogs.com/chenyixue/p/5601285.html Hibernate除了支持HQL查询外,还支持原生SQL查询.          对原 ...

  8. Hibernate原生SQL查询

    最近在做一个较为复杂的查询,hibernate基本的查询不能满足,只好使用其提供的原生sql查询.参考网上的一些资料,做一些总结. 对原生SQL查询执行的控制是通过SQLQuery接口进行的,通过执行 ...

  9. Hibernate原生SQL查询多表关联,SQL语句要注意的问题

    Hibernate原生SQL查询多表关联,SQL语句要注意的问题 @for&ever 2009-9-4 系统环境: MySQL5.1 Hibernate3.3 有如下的假定: 实体类 Ques ...

随机推荐

  1. 雷林鹏分享:Ruby XML, XSLT 和 XPath 教程

    Ruby XML, XSLT 和 XPath 教程 什么是 XML ? XML 指可扩展标记语言(eXtensible Markup Language). 可扩展标记语言,标准通用标记语言的子集,一种 ...

  2. HttpRequest中常见的四种ContentType

    https://www.cnblogs.com/xiaozong/p/5732332.html

  3. 转 CentOS 7 minimal 版本安装后网络配置

    转自[http://www.07net01.com/2016/01/1140061.html] 1.首先使用root登录服务器,输入 nmcli d 我们发现网卡是处于禁用状态. 2.打开网络管理器界 ...

  4. Mybatis整合Spring -- typeAliasesPackage

    Mybatis整合Spring 根据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对Mybatis3的支持. 因此由M ...

  5. MyBatis Generator配置文件context元素的defaultModelType属性

    MyBatis Generator配置文件context元素的defaultModelType属性 MyBatis Generator配置文件context元素有一个defaultModelType属 ...

  6. javascript浅拷贝和深拷贝

    /* 浅拷贝 */ function extend(parent, child) { var i; child = child || {}; for (i in parent) { if (paren ...

  7. git 基础入门操作

    前言: 介绍基础的git入门级指令,虽然git指令非常多,但是实际工作中,我们会用到的非常少,小项目中甚至只需要用到2.3个.而且大部分人都会采用gui,而不是每次都打开终端然后输一长串难记的指令. ...

  8. ios 怎么禁止点击子视图的时候不响应父视图的点击事件

    方法一 可以在触发手势的方法里添加一个区域的判断,如果点击区域正好是子视图的区域,则过滤掉,不处理此时的手势,如果点击的区域没有被子视图覆盖则,处理手势的事件.具体的代码如下:  if( CGRect ...

  9. “之”字形输出二叉树 python

    “之”字形输出二叉树即第1层从左到右输出,第2层从右到左输出,第3层从左到右输出......第2*n层从右到左输出,第2*n+1层从左到右输出,如下图所示二叉树,“之”字形输出的结果为:1-3-2-4 ...

  10. PyalgoTrade 优化(六)

    满足优化器组件.这个想法很简单: 有一个服务器负责: 提供数据来运行策略. 提供运行策略的参数. 记录每个工作线程的策略结果. 有多名工作人员负责: 使用服务器提供的数据和参数运行策略. 为了说明这一 ...