zoukankan      html  css  js  c++  java
  • 笔记:Hibernate DML

    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] + " TotalTradeAmt=" + 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);

       

       

  • 相关阅读:
    Leetcode 349. Intersection of Two Arrays
    hdu 1016 Prime Ring Problem
    map 树木品种
    油田合并
    函数学习
    Leetcode 103. Binary Tree Zigzag Level Order Traversal
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 101. Symmetric Tree
    poj 2524 Ubiquitous Religions(宗教信仰)
    pat 1009. 说反话 (20)
  • 原文地址:https://www.cnblogs.com/li3807/p/6358384.html
Copyright © 2011-2022 走看看