zoukankan      html  css  js  c++  java
  • Hibernate中常用HQL

    HQL是Hibernate自带的查询语言 
    HQL是一种面向对象的查询语言。SQL的操作对象是数据表和列等数据对象,而HQL的操作对象是类、实例、属性等。 
    HQL的语法很像SQL的语法 

    以下举例均以学生类为例:Students.java 

    Java代码  收藏代码
    private String name;  
    private int age;  
      
    public Students(){  
    }  
    public Students(String name,int age){  
       name = this.name;  
       age = this.age;  
    }  
    //get/set方法  
    //。。。。 

    1.from子句 
    规则: from + 持久化类的类名 

    Java代码  收藏代码
    //Students 是学生类,直接这么写就可以查询出Students持久化类对应于数据库表中的所有信息  
    //select可以省略.  
    String hql = "from Students";  
    String hql = "from Students as s";//使用别名  
    String hql = "from Students s";//别名可以省略  
    Query query = getCurrentSession().createQuery(hql);  
    //注意:当省略select子句时,直接使用from子句来查询全部,query.list()返回的是该持久化类型的List  
    List<Students> studentsList = query.list();  


    2.select子句 
    规则:select + 持久化类中属性名(可以多个或一个) + from子句。。。 

    Java代码  收藏代码
    //hql中不可以写 select * 这个实际上是相当于 form Students  
    hql = "select s from Students as s";//相当于 from Students  
    hql = "select s.name from Students as s";//只查询一列,返回List<Object>  
    hql = "select s.name,s.age from Students as s";//查询多列,返回List<Object[]>  
    hql = "select new Students(s.name,s.age) from Students as s"//自定义返回类型,返回List<Students>,同时在Students.java持久化类中要有相应的构造器和无参构造器  
    hql = "select distinct s.name from Students s"//distinct关键字,返回List<Object>  


    下面说一下Select子句的不同返回类型 
    ①Object[]----默认的 
    ②以List 
    ③以map 
    ④自定义 
    ⑤distinct关键字 

    Java代码  收藏代码
    //默认的List<Object[]> 返回,此时需要查询多个属性,一个属性的查询返回的是List<Object>  
    hql = "select s.name,s.age from Students s";  
    List<Object[]> list = query.list();  
      
    //查询一个属性  
    hql = "select s.name from Students s";  
    List<Object> list = query.list();  
      
    //以list返回  
    hql = "select new List (s.name,s.age) from Students s";  
    List<List> list = query.list();  
      
    //以map返回:如果查询字段属性不设别名则key值以序号显示,查询属性使用别名,key值以别名显示  
    hql = "select new map(name,age) from Students";  
    List<Map> list = query.list();  
    list.get(0).get("0");//没有别名时,key以序号命名  
    hql = "select new map(s.name,s.age) from Students s";  
    list.get(0).get("name");//通过别名来获取  
      
    //以自定义的构造器返回:持久化类中必须声明了该构造器和无参构造器  
    hql = "select new Students(s.name,s.age) from Students s";  
    List<Students> list = query.list();  
      
    //以distinct关键字返回  
    hql = "select distinct s.name from Students s";  
    List<Object> list = query.list();//因为是一个字段所有返回List<Object>  

    3.where子句 
    首先说一下Query两种参数传递方式 
    ①使用‘?’占位 

    Java代码  收藏代码
    hql = "from Students where name = ? ";  
    Query query = getCurrentSession().createQuery(hql);  
    query.setParameter(0,"张三",Hibernate.STRING);  
    //第一个参数:表示是第几个'?',从0开始  
    //第二个参数:表示实际查询的内容  
    //第三个参数:表示该参数的类型(可以省略)  


    ②使用变量名 

    Java代码  收藏代码
    hql = "from Students where name = :NAME ";  
    Query query = getCurrentSession().createQuery(hql);  
    query.setParameter("NAME","张三",Hibernate.STRING);  
    //第一个参数:与hql中':'后的变量名对应  
    //第二个参数:表示实际查询的内容  
    //第三个参数:表示该参数的类型(可以省略)  
      
    //当参数是集合时,一定要使用setParameterList()设置参数值  
     hql = "from Students s where name in (:NAME)";    
    Query query = getCurrentSession().createQuery(hql);  
    query.setParameterList("NAME", new Object[] { "张三","李四"});  


    下面是where子句中的应用(因为跟sql类似就不举例) 
    ①比较运算 
    =  <>  <  >  <=  >= 
    null值判断:is null       is not null 
               HQL中可以写 x = null;  / x <> null;  会自动转换成相应sql 
    ②范围运算 
    in() / not in() 
    between 值1 and 值2 

    ③字符串匹配 
    like关键字 
    通配符:"%"---任意字符 
            "_"---一个字符 

    ④逻辑运算 
    and or not 

    ⑤集合运算 
    is empty /is not empty 
    member of 

    ⑥四则运算 
    +  -  *  / 

    4.order by子句 
    同sql:对查询结果排序 
    desc:降序 
    esc:升序(默认) 

    5.分组: Group By ... Having  
    在having子句中不能使用列别名  
    在orderby子句中可以使用列别名 

    Java代码  收藏代码
    hql = "select s.name,count(s.age) from Students s where s.age > 10 group by s.name having count(s.age) > 1 order by s.age";  


    6.聚集函数 
    count(), max(), min(), avg(), sum() 

    7.查询单个对象 

    Java代码  收藏代码
    hql = "from Students where name = '"张三"'";  
    Query query = session.createQuery(hql);  
    Students student = query.uniqueResult();  
    //当查询结果不唯一时,会抛出异常。  

    8.连接查询

  • 相关阅读:
    Linux查看占用内存前10的命令
    使用RestTemplate调用SpringCloud注册中心内的服务
    Eureka集群配置
    MySQL常用命令集合(偏向运维管理)
    pytest: error: unrecognized arguments报错解决
    MongoDB的安装
    MongoDB多条件分组聚合查询
    在排序数组中查找元素的第一个和最后一个位置
    搜索二维矩阵
    搜索旋转排序数组
  • 原文地址:https://www.cnblogs.com/zzmb/p/7733507.html
Copyright © 2011-2022 走看看