首页 > 代码库 > Hql查询语句

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()

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

 

 

Hql查询语句