Hibernate 提供的HQL(Hibernate Query Language)语句也支持批量 update 和 delete 语法,语法格式如下:

[UPDATE | DELETE] FROM <ClassName> [WHERE conditions]

关于上面的语法格式有以下需要值得注意的:

  • 在 FROM子句中,FROM 关键字是可选的,可以不写 FROM 关键字
  • 在 FROM 子句中,只能有一个类名,可以在该类名后指定别名
  • 不能在批量HQL语句中使用连接,显式或者隐式的都不行,但可以在 WHERE 子句中使用子查询
  • 整个 WHERE 子句是可选的

 
 

要使用HQL查询,使用HQL查询按如下步骤进行:

  • 获取 Hibernate Session 对象
  • 编写HQL语句
  • 以HQL语句做为参数,调用Session的 createQuery 方法创建查询对象
  • 如果HQL语句包含参数,这调用 Query 对象的 SetXxx() 方法为参数赋值
  • 调用Query 对象的 list()、uniqueResult()、executeUpdate() 等方法返回查询结果或更新结果

     
     

代码片段如下:

public static void main(String[] args) {

Session curSession = hibernateUtils.openSession();

Transaction curTransaction = null;

Calendar calendar = Calendar.getInstance(Locale.CHINA);

try {

String updateStatement = "Update TransitRecordModel Set totalTradeAmt = totalTradeAmt + :plusVal where recordID > 2600 AND recordID < 2700";

curTransaction = curSession.beginTransaction();

int updateEntities = curSession.createQuery(updateStatement).setInteger("plusVal", 2).executeUpdate();

curTransaction.commit();

System.out.println("Update 成功,更新记录行 " + updateEntities);

} finally {

if (curSession != null) {

curSession.close();

}

}

}

 
 

  1. 关联和连接,当程序需要从多个表中取得数据时,SQL语句将会考虑使用多表连接查询,Hibernate 使用关联映射来处理底层数据表之间的连接,HQL 支持两种关联连接(join)形式:隐式(implicit)与显示(explicit)
    1. 隐式关联:隐式连接不使用 join 关键字,使用英文点号(.)来隐式连接关联实体(Hinbernate 3.2.2 版本之前支持),而Hibernate底层将自动进行关联查询,示例:

      SELECT t From TransitRecordModel t where t.details.tradeAmt > :tradeAmt

  • 显示关联:使用显示连接时可以为相关联的实体,甚至关联集合中的全部元素指定一个别名,HQL 连接类型直接借鉴了了SQL99多表查询的关键字,可以使用如下连接方式:
    • inner join(内连接),可简写为 join,示例如下:

      SELECT Distinct trm FROM TransitRecordModel trm inner join trm.details d where d.tradeAmt > 25

    • left outer join(左外连接),可简写为 left join
    • right outer join(右外连接),可简写为 right join
    • full join(全连接)
  1. 对于有集合的属性的,Hibernate将默认采用延迟加载策略,如果需要改变该策略,可以在持久化注解中指定 fetch=FetchType.EAGER,或者在关联查询时增加 fetch 关键字,示例如下:

    SELECT Distinct trm FROM TransitRecordModel trm inner join fetch trm.details d where d.tradeAmt > 25

  • fetch 关键字不应该与 setMaxResults()或者setFirstResult()共用
  • fetch不能与独立的with条件一起使用
  • full join fetch 和 right join fetch 是没有任何意义
  1. 投影、聚合和分組,实际上是一种基于列的运算,通常用于投影到指定列(也就是过滤其他列,类似与 select 子句的作用),还可以完成SQL语句中常用的分组、组筛选等功能,Hibernate 的条件过滤中使用 Projection 代码投影运算,一旦产生 Projection 对象后,就可以通过 Criteria 提供的 setProejction 方法来进行投影运算,每个 Criteria 只能接受一个投影运算,因此如果要进行多个投影运算,则可以使用 Projection.ProjectionList 类来提供,该类是 Projection的子类,示例如下:

    list = curSession.createCriteria(TransitRecordModel.class)

    .setProjection(Projections.projectionList()

    .add(Projections.rowCount())

    .add(Projections.avg("totalTradeAmt"))

    .addOrder(Order.desc("createTime")).list();

    for (Object obj : list) {

    Object[] ele = (Object[]) obj;

    System.out.println("RowCount=" + ele[0] + "\tTotalTradeAmt=" + ele[1]);

    }

    System.out.println("查询完成,查询共计 " + list.size() + " 行记录");

  2. 离线查询和子查询,条件查询的离线查询由 DetachedCriteria 来代表,允许在一个Session范围之外创建一个查询,并且可以使用任务的Session来执行他,示例如下:

    // 创建离线查询对象

    DetachedCriteria detachedCriteria = DetachedCriteria.forClass(TransitRecordModel.class);

    detachedCriteria.setProjection(Property.forName("totalTradeAmt"));

    // 在指定的 Session 中查询

    list = detachedCriteria.getExecutableCriteria(curSession).list();

    System.out.println("TotalTradeAmt=" + obj);

 
 

 
 

笔记:Hibernate DML的更多相关文章

  1. Hibernate学习笔记-Hibernate关系映射

    1. 初识Hibernate——关系映射 http://blog.csdn.net/laner0515/article/details/12905711 2. Hibernate 笔记8 关系映射1( ...

  2. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  3. [ 学习笔记 ] Hibernate框架学习之一

    一.JavaEE开发三层结构和三大框架的对应关系: Struts2框架 -> 表现层 web层(MVC是表现层的设计模型) 业务层 service层 Hibernate框架 -> 持久层 ...

  4. Hibernate笔记——Hibernate介绍和初次环境配置

    Hibernate简介 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库. Hibernate ...

  5. Hibernate学习笔记--Hibernate框架错误集合及解决

    错误1:MappingException: Unknown entity解决方案 http://jingyan.baidu.com/article/e75aca8552761b142edac6cf.h ...

  6. Hibernate笔记②--hibernate类生成表、id生成策略、级联设置、继承映射

    一.多表的一个关联关系 老师和学生是一对多的关系 student:tid属性 外键约束 对应teacher表中的id属性 teacher:id 在myeclipse的db窗口中选中两个表来生成类.   ...

  7. MySQL学习笔记2——DML

    DML(数据操作语言,它是对表记录的操作(增,删,改)!) 1.插入数据 *INSERT INTO 表名(列名1,列名2,...) VALUES(列值1,列值2,...); >在表名后给出要插入 ...

  8. [学习笔记] Hibernate 4.3.5 下载与安装

    下载 http://hibernate.org/orm/releases/4.3/ https://sourceforge.net/projects/hibernate/files/hibernate ...

  9. MySQL笔记总结-DML语言

    DML语言 插入 一.方式一 语法: insert into 表名(字段名,...) values(值,...); 特点: 1.要求值的类型和字段的类型要一致或兼容 2.字段的个数和顺序不一定与原始表 ...

随机推荐

  1. Jmeter_beanshell实现字符串加密

    Jmeter内置的没有MD5加密方法,所以需要写一些java代码实现加密功能,以下是具体操作: 1:用eclipse建个工程(包名.类名.方法名自己起) package com.wjika.test; ...

  2. RS232 3线制与7线制的区别

    当通信距离较近时,可不需要Modem,通信双方可以直接连接,这种情况下,只需使用少数几根信号线.最简单的情况,在通信中根本不需要RS-232C的控制联络信号,只需三根线(发送线.接收线.信号地线)便可 ...

  3. [php]在PHP中读取和写入WORD文档的代码

    测试平台windows 使用的windows的com主键. <? // 建立一个指向新COM组件的索引 $word = new COM("word.application") ...

  4. dojo CsvStore简介

    dojox.data.CsvStore 作者:Jared Jurkiewicz 版本:V1.0 CsvStore是由dojo提供的简单的只读存储,并且是包含在dojox项目中的.CsvStore是读取 ...

  5. Naive Bayes (NB Model) 初识

    1,Bayes定理 P(A,B)=P(A|B)P(B); P(A,B)=P(B|A)P(A); P(A|B)=P(B|A)P(A)/P(B);    贝叶斯定理变形 2,概率图模型 2.1  定义 概 ...

  6. ASP.NET性能调试

    该文转自mx5721的博客:http://blog.csdn.net/mx5721/article/details/9138135 设计考虑 性能和安全的考虑 应用程序逻辑划分的考虑:逻辑分层,然后使 ...

  7. 优化一个小时不出结果的SQL

    今天刚清闲点,在网上看些资料,这时,用户QQ上发来求助,说一个更新数据的SQL语句很慢,都一个小时了也不出结果,于是,了解下具体的情况,略施小计,5s出结果,下面是我分析该SQL时用到的执行计划,略去 ...

  8. 【转载】Java并发编程:volatile关键字解析(写的非常好的一篇文章)

    原文出处: 海子 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volat ...

  9. 如何通过java反射的方式对java私有方法进行单元测试

    待测试的私有方法: import org.testng.Assert;import org.testng.annotations.BeforeClass;import org.testng.annot ...

  10. RobotFramework下的http接口自动化Get Response Status 关键字的使用

    Get Response Status 关键字用来获取http请求返回的http状态码. 示例1:访问苏宁易购网站上的http推荐接口,使用Get Response Status 关键字来获取返回的h ...