• Hql查询语句


    1、多表查询得到的结果集是一个对象数组,即二维数组的列属性是由两个对象的属性组成的。每一行记录是一个对象数组,数组里的元素对应具体的对象。

    String hql = "from tBookInfo book, BookSelection sel where book.id = sel.bookId"; ==from Order as o inner join o.products as product;
    Collection result = new ArrayList();
    Transaction tx = null;
    try {
    Session session = HibernateUtil.currentSession();
    tx = session.beginTransaction();
    Query query = session.createQuery(sql);
    result = query.list();
    tx.commit();

    } catch (Exception e) {
          throw e;
    } finally {
    HibernateUtil.closeSession();
    }
    ArrayList sList = (ArrayList) result;
    Iterator iterator1 = sList.iterator();
    while (iterator1.hasNext()) {
    Object[] o = (Object[]) iterator1.next();

    //这里可以把每个对象添加到list集合中,供前台jsp调用
    tBookInfo bookInfo = (tBookInfo) o[0];
    BookSelection bookSelect = (BookSelection) o[1];
    System.out.println("BookInfo-Title: " + bookInfo.getTitle());
    System.out.println("BookSelection-BookSelectionId: " + bookSelect.getId());
    }

     

    区别:SQL与HQl

    SQL针对的是数据表和列来查询,HQL是对对象和属性查询,Hql关键字不区分大小写,但是类名和属性区分大小写。查询的如果是整个类对象,可以省略select.

    1、简单的查询

    hql = "FROM Employee";

    hql = "FROM Employee AS e"; // 使用别名

    "FROM Employee e"; // 使用别名,as关键字可省略

    2、带上过滤条件的(可以使用别名):Where

    hql = "from Employee where id<10";

    hql = "FROM Employee e WHERE e.id<10";

    hql = "FROM Employee e WHERE e.id<10 AND e.id>5";

    3、带上排序条件的:Order By  默认升序:asc;降序:desc

    hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name";

    hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC";

    hql = "FROM Employee e WHERE e.id<10 ORDER BY e.name DESC, id ASC";//asc升序、desc降序:先按照名字降序排序,名字相同按照id升序排序。

    以上三种情况查出来的结果集都是list对象集合。

    4、指定select子句(不可以使用select *)

    hql = "SELECT e.name FROM Employee e"; // 只查询一个列,返回的集合的元素类型就是这个属性的类型。得到的结果集是一个list,类型是这个属性的类型,返回的并不是对象数组,因为它只有一列。

    hql = "SELECT e.id,e.name FROM Employee e"; // 查询多个列,返回的集合的元素类型是Object数组。返回的集合元素类型准确的说是集合里的每个元素都是对象数组,对象数组存放的是你所查询的属性值。

    hql = "SELECT new Employee(e.id,e.name) FROM Employee e"; // 可以使用new语法,指定把查询出的部分属性封装到对象中。这种查询方式需要在对象中有相应的构造方法。

    5、聚集函数:count(), max(), min(), avg(), sum()

    max(), min(), avg(), sum()这三个函数返回的都是一个结果,即是根据你查询得到的行数据进行计算的。如计算最大的id号的hql语句:

     hql = "SELECT max(id) FROM Employee where id>1 and id<5";最大的id是在1到5之间查找的,不是整个数据表。同理,min()、sum()也是一样的。

    Number result = (Number) session.createQuery(hql).uniqueResult();//确定只有一个结果集用这个方法uniqueResult。

    conut()方法如果不进行分组的话也是返回一列数据的结果,它的功能就是计数(不为空的列的个数)。如计算各个系有多少学生应该这样写:

    hql = "select e.name,d.name,count(d.name) from Employee e join e.department d group by d.name";

     List list = session.createQuery(hql).list();集合的元素是对象数组。如果不要group by d.name这个条件,返回的只有一行数据。其实就是简单的拆分的问题,加上分组就相当于1+2=3.不要分组就是显示3.就这么简单。

          数组对象---[wkl, 生物系, 2]
          数组对象---[wed, 计算机系, 1]

     hql = "SELECT min(id) FROM Employee"; // 返回的结果是id属性的类型

    6、分组: Group By ... Having

    hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name";//返回的集合元素是对象数组。注意:GROUP BY后的条件必须是前面选择过的条件。

    hql = "SELECT e.name,COUNT(e.id) FROM Employee e GROUP BY e.name HAVING count(e.id)>1";//返回的集合元素是对象数组。注意:GROUP BY后的条件必须是前面选择过的条件。HAVING是对组内进行选择的,即分组完成后再进行选择。

    hql = "SELECT e.name,COUNT(e.id) FROM Employee e WHERE id<9 GROUP BY e.name HAVING count(e.id)>1";

    hql = "SELECT e.name,COUNT(e.id) " + //查询名字跟数量
             "FROM Employee e " + //从该表查询
             "WHERE id<50 " + //id<50
             "GROUP BY e.name " + //通过名字来分组(相同名字作为一组)
             "HAVING count(e.id)>=1 " + //筛选条件,这个是针对组内来筛选的(当完成分组后进行选择)
             "ORDER BY count(e.id) ASC";//排序

    如下图:

     

     

    7、连接查询 / HQL是面向对象的查询

    >> 内连接(inner关键字可以省略)

    hql = "SELECT e.id,e.name,d.name FROM Employee e INNER JOIN e.department d";

    hql = "SELECT e.id,e.name,d.name FROM Employee e JOIN e.department d"; //针对多对一,即两边都有相同的属性字段才查询出来。这里员工与部门是多对一的联系,员工有部门的属性(部门主键作为外键)。这里查到的结果是员工所属的部门名称。

     >> 左外连接(outer关键字可以省略)

    左外连接顾名思义就是左边表的数据全部列出来,右边表有对应的则显示出来,无则显示为空。

     hql = "SELECT e.id,e.name,d.name FROM Employee e LEFT JOIN e.department d where e.id>40 ";

    如图所示:

    >> 右外连接(outer关键字可以省略)

    右外连接顾名思义就是右边表的数据全部列出来,左边表有对应的则显示出来,无则显示为空。

     hql = "SELECT e.id,e.name,d.name FROM Employee e RIGHT JOIN e.department d where id>20";

    如图所示:

    可以使用更加简单的方法

    hql = "SELECT e.id,e.name,e.department.name FROM Employee e";

    这种方式查询到的结果是跟内连接一样的,有对应记录才会显示出来

    如:[1, wkl, xxx部门]

     

    8、>> Update

    // int result = session.createQuery(//
            // "UPDATE Employee e SET e.name=? WHERE id>15")//
            // .setParameter(0, "无名氏")//
            // .executeUpdate(); // 返回int型的结果,表示影响了多少行。

    9、>> Delete

    //int result = session.createQuery(//
            //        "DELETE FROM Employee e WHERE id>15")//
            //        .executeUpdate(); // 返回int型的结果,表示影响了多少行。

     

     

  • 相关阅读:
    JetBrains下载历史版本
    php入门笔记
    Ajax获取服务器信息
    Ubuntu上安装PHP环境-mysql+apache+php-Linux操作系统
    Ubuntu彻底删除/卸载mysql,php,apache
    轻松理解JS基本包装对象
    JS事件委托
    浅谈JS事件冒泡
    JS闭包那些事
    浅谈JS的变量提升
  • 原文地址:https://www.cnblogs.com/kailing-con/p/4244830.html
Copyright © 2020-2023  润新知