Hibernate HQL ②
分页查询:
- setFirstResult(int firstResult):设定从哪一个对象开始检索,参数 firstResult 表示这个对象在查询结果中的索引位置,索引位置的起始值为零。默认情况下,Query 从查询结果中的第一个对象开始检索
- setMaxResult(int maxResults):设定一次最多检索出的对象的数目。在默认情况下,Query 和 Criteria 接口检索出查询结果中所有的对象
public void testPageQuery(){ String hql = "FROM Employee"; Query query = session.createQuery(hql); int pageNo = 3; int pageSize = 5; List<Employee> employees = query.setMaxResults(pageSize) .setFirstResult((pageNo - 1) * pageSize) .list(); for(Employee employee : employees){ System.out.println(employee.getId()); } }
在映射文件中定义命名查询语句:
- Hibernate 允许在映射文件中定义字符串形式的查询语句
- <query> 元素用于定义一个 HQL 查询语句,它和 <class> 元素并列
- 在程序中通过 Session 中的 getNamedQuery()方法获取查询语句对应的 Query 对象
public void testNamedQuery(){ Query query = session.getNamedQuery("myQuery"); List<Employee> employees = query.setInteger("minId", 100) .setInteger("maxId", 108) .list(); for(Employee employee : employees){ System.out.println(employee.getId()); } }
<query name="myQuery"><![CDATA[FROM Employee e WHERE e.id > :minId AND e.id < :maxId]]></query>
投影查询:
- 查询结果仅包含实体的部分属性。通过 SELECT 关键字实现。
- Query 的 list 方法返回集合中包含的是数组类型的元素,每个对象数组代表查询结果的一条记录
- 可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录,使程序代码能完全运用面向对象的语义来访问查询结果集
- 通过 DISTINCT 关键字来保证查询结果不会返回重复元素
@Test public void testFieldQuery(){ String hql = "SELECT new Employee(e.lastName, e.department) FROM Employee e WHERE e.department = :dept"; Query query = session.createQuery(hql); Department dept = new Department(); dept.setDeptId(80); List<Employee> employees = query.setEntity("dept", dept) .list(); for(Employee employee : employees){ System.out.println(employee.getId() + ", " + employee.getLastName() +", " + employee.getDepartment().getDeptId()); } }
精诚所至,金石为开。