Hibernate---HQL查询---分页查询

分页检索

  1. setFirstResult(int firstResult): 设定从哪一个对象开始检索, 参数 firstResult 表示这个对象在查询结果中的索引位置, 索引位置的起始值为 0. 默认情况下, Query 从查询结果中的第一个对象开始检索
  2. setMaxResults(int maxResults): 设定一次最多检索出的对象的数目. 在默认情况下, Query 和 Criteria 接口检索出查询结果中所有的对象
  • 示例:
  • Session对象在测试类中已经初始化好了

    @Test
    public void testLimit(){
        int currentPage = 5;//从第五页开始
        int lineSize = 5; //每页显示5行记录
        String hql = "FROM Employee";
        Query query = this.session.createQuery(hql);
        query.setFirstResult((currentPage-1)*lineSize);
        query.setMaxResults(lineSize);

        List<Employee> list = query.list();
        System.out.println(list);
    }
  • 使用的是Oracle数据库所以查询使用的是"Rownum"列完成的
    在这里插入图片描述

在映射文件中定义命名查询语句

  • Hibernate 允许在映射文件中定义字符串形式的查询语句.
  • <query> 元素用于定义一个 HQL 查询语句, 它和<class> 元素并列.
  • 示例:
  • 因为hql语句之中可能会出现">","<“等特殊符号,所以为了避免产生冲突,所以最好将hql语句写在”<![CDATA[ -------内容---------]]>"之中
 <query name="findNameById">
     <![CDATA[SELECT name FROM Employee e WHERE e.id = ?]]>
 </query>

在程序中通过 Session 的 getNamedQuery() 方法获取查询语句对应的 Query 对象.

 @Test
 public void testName(){
     Query query = this.session.getNamedQuery("findNameById");
     query.setInteger(0,222);
     List<String> list= query.list();
     System.out.println(list);
 }
  • 输出结果

在这里插入图片描述

投影查询

  • 投影查询: 查询结果仅包含实体的部分属性. 通过 SELECT 关键字实现.
  • Query 的 list() 方法返回的集合中包含的是数组类型的元素, 每个对象数组代表查询结果的一条记录
  • 可以在持久化类中定义一个对象的构造器来包装投影查询返回的记录, 使程序代码能完全运用面向对象的语义来访问查询结果集.
  • 可以通过 DISTINCT 关键字来保证查询结果不会返回重复元素
@Test
public void testProjection(){
   String hql = "SELECT id,name,email FROM Employee WHERE salary > ?";
   Query query = this.session.createQuery(hql);
   query.setFloat(0,108);

   List<Object[]> all = query.list();
   for(Object[] objects:all){
       System.out.println(Arrays.asList(objects));
   }
}

在这里插入图片描述

  • 现在的返回结果的结合中的类型是一个Object[] 数组类型,如果希望返回的结果集合中的类型是一个普通Java类型,可以利用构造器的语义方式实现
    @Test
    public void testProjection(){
       String hql = "SELECT new Employee(id,name,email) FROM Employee WHERE salary > ?";
       Query query = this.session.createQuery(hql);
       query.setFloat(0,108);

       List<Employee> all = query.list();
       for(Employee object:all){
           System.out.println(object);
       }
    }
  • "new Employee(id,name,email)"部分就相当于是调用Employee类的构造器,所以在Employee类中需要定义有对应构造器
    public Employee(Integer id,String name,String email){
        this.id=id;
        this.name = name;
        this.email = email;
    }
  • 测试结果

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43386754/article/details/87958024
今日推荐