Hibernate HQL详解

版权声明:本文为博主原创文章,如需转载请标注转载地址。html

博客地址:http://www.cnblogs.com/caoyc/p/5606444.html 数组

一、实体查询:

  hql="FROM User";session

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

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

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

 

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

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

  方式一:xml

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

  这种方式不被推荐,当若是id=0的User对象不存在是,使用get(0)会抛出异常,咱们一般使用下面这种方式htm

  方式二:经过uniqueResult()方法,该方法返回一个Object对象,若是对象不存在则返回null,若是返回值不惟一,则抛出异常对象

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

 

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

  hql="SELECT id,name FROM User";blog

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

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

 

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

  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也会抛出异常,由于这种方式采用的是默认构造。值得注意的是,若是使用的新构造对象,那么处理指定的属性会被赋予新值外,其它属性均为默认值。

  

五、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

 

六、使用占位符"?"

  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开始

 

七、使用参数

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

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

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

 

八、使用集合或数组参数

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

 

九、使用命名方式查询

  若是咱们将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块来包裹着

相关文章
相关标签/搜索