HQL:Hibernate Query Language 简单属性查询:
//返回结果集属性列表,元素类型和实体类中的属性类型一致
List students = session.createQuery("select name from Student").list();
多个属性的查询:
//查询多个属性,返回对象数组集合
List students = session.createQuery("select id, name from Student").list();
多个属性查询,返回对象:
List students = session.createQuery("select new Student(id, name) from Student").list();
使用别名:
List students = session.createQuery("select s.id, s.name from Student s").list();
实体对象查询:
List students = session.createQuery("from Student").list();
List students = session.createQuery("select s from Student s").list();
不支持select * from这种语法
外置命名查询:
在student.hbm.xml文件中添加:
<query name="queryStudent"> <![CDATA[
select s from Student s where s.id <?
]]>
</query>
List students = session.getNamedQuery("queryStudent")
.setParameter(0, 10)
.list();
查询过滤器:
在student.hbm.xml中添加:
<class ...> ...
<filter name="testFilter" condition="id < :myid"></filter>
</class>
<filter-def name="testFilter">
<filter-param type="integer" name="myid"/> </filter-def>
var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.appendChild(script);
session.enableFilter("testFilter")
.setParameter("myid", 10);
List students = session.createQuery("from Student").list();
分页查询: List students = session.createQuery("from Student") .setFirstResult(1) .setMaxResults(2)
.list();
对象导航查询:
List students = session.createQuery("from Student s where
s.classes.name like '%2%'")
.list();
连接查询:
常用的是内连接,外连接(左连接/右连接);
内连接:返回的是对象数组 List students = session.createQuery("select c.name, s.name from Student s join s.classes c")
.list();
Object[] obj = (Object[])iter.next();
左外连: List students = session.createQuery("select c.name, s.name
from Student s left join s.classes c")
左外连: List students = session.createQuery("select c.name, s.name from Student s right join s.classes c")
.list();
统计查询: Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult(); String hql = "select c.name, count(s) from Classes c join c.students s group by c.name order by c.name";
List students = session.createQuery(hql).list(); for (int i=0; i<students.size(); i++) { Object[] obj = (Object[])students.get(i); System.out.println(obj[0] + ", " + obj[1]);
}
DML风格的查询: 而数据库更新了,缓存不更新,所以要尽量少用。 Student student = (Student)session.get(Student.class, 1); session.createQuery("update Student s set s.name=? where s.id<?")
.setParameter(0, "王五") .setParameter(1, 5)
.executeUpdate();
student = (Student)session.get(Student.class, 1); //get方法
获取缓存中没有更新的数据,导致读取的数据和数据库中的不一致。
//返回结果集属性列表,元素类型和实体类中的属性类型一致
List students = session.createQuery("select name from Student").list();
多个属性的查询:
//查询多个属性,返回对象数组集合
List students = session.createQuery("select id, name from Student").list();
多个属性查询,返回对象:
List students = session.createQuery("select new Student(id, name) from Student").list();
使用别名:
List students = session.createQuery("select s.id, s.name from Student s").list();
实体对象查询:
List students = session.createQuery("from Student").list();
List students = session.createQuery("select s from Student s").list();
不支持select * from这种语法
外置命名查询:
在student.hbm.xml文件中添加:
<query name="queryStudent"> <![CDATA[
select s from Student s where s.id <?
]]>
</query>
List students = session.getNamedQuery("queryStudent")
.setParameter(0, 10)
.list();
查询过滤器:
在student.hbm.xml中添加:
<class ...> ...
<filter name="testFilter" condition="id < :myid"></filter>
</class>
<filter-def name="testFilter">
<filter-param type="integer" name="myid"/> </filter-def>
var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/baichuan/ns.js'; document.body.appendChild(script);
session.enableFilter("testFilter")
.setParameter("myid", 10);
List students = session.createQuery("from Student").list();
分页查询: List students = session.createQuery("from Student") .setFirstResult(1) .setMaxResults(2)
.list();
对象导航查询:
List students = session.createQuery("from Student s where
s.classes.name like '%2%'")
.list();
连接查询:
常用的是内连接,外连接(左连接/右连接);
内连接:返回的是对象数组 List students = session.createQuery("select c.name, s.name from Student s join s.classes c")
.list();
Object[] obj = (Object[])iter.next();
左外连: List students = session.createQuery("select c.name, s.name
from Student s left join s.classes c")
左外连: List students = session.createQuery("select c.name, s.name from Student s right join s.classes c")
.list();
统计查询: Long count = (Long)session.createQuery("select count(*) from Student").uniqueResult(); String hql = "select c.name, count(s) from Classes c join c.students s group by c.name order by c.name";
List students = session.createQuery(hql).list(); for (int i=0; i<students.size(); i++) { Object[] obj = (Object[])students.get(i); System.out.println(obj[0] + ", " + obj[1]);
}
DML风格的查询: 而数据库更新了,缓存不更新,所以要尽量少用。 Student student = (Student)session.get(Student.class, 1); session.createQuery("update Student s set s.name=? where s.id<?")
.setParameter(0, "王五") .setParameter(1, 5)
.executeUpdate();
student = (Student)session.get(Student.class, 1); //get方法
获取缓存中没有更新的数据,导致读取的数据和数据库中的不一致。