1. 分页查询
–setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置,
索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索
–setMaxResults(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下,
Query 和 Criteria 接口检索出查询结果中所有的对象
2.命名查询
–Hibernate 允许在映射文件中定义字符串形式的查询语句.
–<query> 元素用于定义一个 HQL 查询语句, 它和 <class> 元素并列.
<query name="salary">
<!-- <![CDATA[ ]]> 防止符号引发错误 -->
<![CDATA[FROM Employee e WHERE e.salary> :min AND e.salary< :max ]]>
</query>
–在程序中通过 Session 的 getNamedQuery() 方法获取查询语句对应的 Query 对象.
@Test
public void testNamedQuery(){
Query query = session.getNamedQuery("salary");
List<Employee> emps = query.setFloat("min", 5000)
.setFloat("max", 10000)
.ist();
System.out.println(emps.size());
}
3.投影查询。
-查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现.
-Query 的 list() 方法返回的集合中包含的是数组类型的元素, 每个对象数组代表查询结果的一条记录
@Test
public void testFieldQuery(){
String sql = "select e.email,e.salary from Employee e where e.dept = :dept";
Query query = session.createQuery(sql);
Department department = new Department();
department.setId(80);
//没有包装的时候,返回的时数组类型的元素。
List<Object[]> result = query.setEntity("dept", department).list();
for(Object[] obj:result){
System.out.println(Arrays.asList(obj));
}
}
-可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录,
使程序代码能完全运用面向对象的语义来访问查询结果集.
@Test
public void testFieldQuery(){
String sql = "select new Employee(e.email,e.salary)"
+ "from Employee e where e.dept = :dept";
Query query = session.createQuery(sql);
Department department = new Department();
department.setId(80);
//包装后,返回包装类型的元素。
List<Employee> result = query.setEntity("dept", department).list();
for(Employee emp:result){
System.out.println(emp.getEmail());
}
}
-可以通过 DISTINCT 关键字来保证查询结果不会返回重复元素
4.报表查询。
•报表查询用于对数据分组和统计, 与 SQL 一样, HQL 利用 GROUP BY 关键字对数据分组,
用 HAVING 关键字对分组数据设定约束条件.
•在 HQL 查询语句中可以调用以下聚集函数
–count() –min() –max() –sum() –avg()
@Test
public void testGroupBy(){
String hql = "SELECT min(e.salary), max(e.salary) "
+ "FROM Employee e "
+ "GROUP BY e.dept "
+ "HAVING min(salary) > :minSal";
Query query = session.createQuery(hql)
.setFloat("minSal", 8000);
List<Object []> result = query.list();
for(Object [] objs: result){
System.out.println(Arrays.asList(objs));
}
}