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);

       

       

  • 相关阅读:
    马拦过河卒
    最小生成树 kruskal算法
    链表,关键是结构体的快排
    Shortest Prefixes 字典树
    串的匹配
    A Beautiful Meadow
    Tiling
    邻接矩阵的宽度遍历
    邻接矩阵的深度遍历
    Form1.frm
  • 原文地址:https://www.cnblogs.com/li3807/p/6358384.html
Copyright © 2011-2022 走看看