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型的结果,表示影响了多少行。

 

 

原文地址:https://www.cnblogs.com/kailing-con/p/4244830.html