zoukankan      html  css  js  c++  java
  • HQL详解

    1、实体查询:

      hql="FROM User";

    List list= session.createQuery(hql).list();

     for(Object obj:list){
      System.out.println(obj);
      }

      【注意】:HQL语句中关键字不区分大小写,但是实体类和对象属性要区分大小写

    2、查询某个对象的某个属性

      hql="SELECT name FROM User where id=1";

      方式一:

    Object name= session.createQuery(hql).list().get(0);
    System.out.println(name);

      这种方式不被推荐,当如果id=0的User对象不存在是,使用get(0)会抛出异常,我们通常使用下面这种方式

      方式二:通过uniqueResult()方法,该方法返回一个Object对象,如果对象不存在则返回null,如果返回值不唯一,则抛出异常

    1 Object name= session.createQuery(hql).uniqueResult();
    2 System.out.println(name)

    3、查询其中几列数据,返回一个数组

      hql="SELECT id,name FROM User";

    List list= session.createQuery(hql).list();
    for(Object obj:list){
        System.out.println(Arrays.toString((Object[])obj));
    }

      list()返回的是一个List<Object>对象

    4、查询其中几列数据,返回一个实体类

      hql="SELECT new User(id,name) FROM User";

    List<User> list= session.createQuery(hql).list();
    for(User user:list){
        System.out.println(user);
    }

      HQL通过new的方式可以返回一个新的实体类,比如说上面通过new User(id,name)方式将id,name返回给User,要求User必须包含一个相对应的构造函数,否则会抛出异常,同时我们还有应该给User指定一个默认的构造函数,否则使用From User也会抛出异常,因为这种方式采用的是默认构造。值得注意的是,如果使用的新构造对象,那么处理指定的属性会被赋予新值外,其它属性均为默认值。

      

    5、WHER、GROUP BY、HAVING和ORDER综合使用

      hql="SELECT age, COUNT(age) num FROM User WHERE age>10 GROUP BY age HAVING COUNT(age)>1 ORDER BY num DESC";

      在HAVING中,不能使用别名num,但在ORDER BY中可以使用别名num

    6、使用占位符"?"

      hql="FROM User where id=?";

    User user= (User)session.createQuery(hql)
            .setParameter(0, 2)
            .uniqueResult();
    System.out.println(user);

      Hibernate和JDBC占位符的区别:在Hibernate占位符下标从0开始,在JDBC中的占位符下标从1开始

    7、使用参数

      hql="FROM User where id=:id";

    User user= (User)session.createQuery(hql)
            .setParameter("id", 2)
            .uniqueResult();
    System.out.println(user);

      使用参数的方式,在HQL中在参数前面需要加上冒号

    8、使用集合或数组参数

      hql="FROM User where id IN (:ids)";

    List<User> list= session.createQuery(hql)
            .setParameterList("ids", new Object[]{1,3,4})
            .list();
    for (User user : list) {
        System.out.println(user);
    }

    9、使用命名方式查询

      如果我们将HQL代码写在类中,那么编译后我们非常难以维护,为了后期代码的可维护行,我们需要将HQL代码写在对应类的.hbm.xml文件中,例如:

    <query name="queryUserRanage">
        FROM User WHERE id BETWEEN ? AND ?
    </query>

      在Java代码中

    复制代码
    Query query=session.getNamedQuery("queryUserRanage");
    List<User> list=query
                    .setParameter(0, 10)
                    .setParameter(1, 20)
                    .list();
    for(User user:list){
        System.out.println(user);
    }
    复制代码

      通常我们使用参数的方式,这样可以很直观知道每个参数的作用

    <query name="queryUserRanage">
        FROM User WHERE id BETWEEN :minId AND :maxId
    </query>

      但是如果在SQL语句中存在>、<等xml中特殊字符,这些字符在xml中都有特殊的意义,所有我们不能直接这样写

      【Error】

    <query name="queryUserRanage">
        FROM User WHERE id > :minId AND id< :maxId
    </query>

      【Right】

    <query name="queryUserRanage">
        FROM User WHERE id &gt; :minId AND &lt; :maxId
    </query>

      虽然上面的方式我们可以正确执行,但是代码显示不够友好,所有我们推荐使用下面的一种方式

    <query name="queryUserRanage">
        <![CDATA[FROM User WHERE id > :minId AND < :maxId]]
    </query>

      CDATA代码块说明在代码中的语句不需要转义,我们一个HQL都推荐用CDATA块来包裹着

  • 相关阅读:
    Git 分支创建,合并, 分支切换, 分支拉取,提交
    Win7 Nodejs 安装
    .ssh github
    xxxx.IronManager was loaded by com.taobao.pandora.boot.loader.XxxxClassLoader@xxx,it should be loaded by Pandora Container...与摒弃引进别的项目的一些冲突包
    推荐一波微软家的浏览器:EDGE
    谷歌浏览器新功能 Copy Declaration
    微信支付回调数据接收不完整解决方案
    开源物联网框架EasyIot(适用于快递柜&售货机)
    开源物联网框架EasyIot场景落地(适用于快递柜、储物柜)
    海康摄像头音频方案(播放音频文件+语音对讲+语音转发)支持window/Linuxjava版本
  • 原文地址:https://www.cnblogs.com/wyl123/p/8119160.html
Copyright © 2011-2022 走看看