首页 > 代码库 > 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查询语句