2.1 Query类介绍

顺便说一句,另一个重要的点是Query helper 类。你可以在这个例子中看到它:

public List<Employee> getAllEmployes() {
    try (Session session = sessionFactory.openSession()) {
            Query<Employee> query = session.createQuery("from Employee", Employee.class);
            return query.list();
    }
}

事实上,Query 是一个接口,它针对不同的情况有多种实现。但为简单起见,我将继续称其为类。比方说,就 OOP 而言,这是广义上的类。

笔记。曾经有两个类:

  • 查询描述查询。
  • TypedQuery描述具有已知类型的查询。

第一个出现在 Hibernate 已经存在并且还没有泛型的时候。然后,在 JDK 5 发布后,Hibernate 又增加了一个类——TypedQuery,它已经支持查询结果的类型化。

但是,据我所知,从 Hibernate 第 5 版开始,只剩下一个类型类,现在称为 Query。

创建查询的标准方法是:


Query<Employee> query = session.createQuery("from Employee", Employee.class);

您学习了如何创建 Query 对象,但是如何执行这些查询呢?

这里更简单——我们只需调用Query 对象的list()方法:


Query<Employee> query = session.createQuery("from Employee", Employee.class);
List<Employee> resultLіst = query.list();

list()方法有一个 JPA 同义词,一种做同样事情但称为getResultList()的方法。有时您可以在其他程序员编写的代码中看到它。

顺便说一句,如果查询暗示结果将在单个结果中,那么使用uniqueResult()方法调用查询会更容易。


Query<Employee> query = session.createQuery("from Employee where id = 1", Employee.class);
Employee result = query.uniqueResult();

uniqueResult()方法有一个 JPA 同义词,即singleResult()方法。它是为了 Hibernate 与 JPA 标准的兼容性而引入的。他做同样的事情。

2.2 查询类方法

事实上,Query 类有很多不同的方法。下面我再说其中的三个。

第一个是stream()方法。及其 JPA 同义词getResultStream()

这两种方法都返回数据流而不是列表。当您不需要一次获得作为查询结果的所有对象时,这种方法会非常有效。或者有可能只使用其中的第一个。

例子:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
Stream<Employee> stream = query.stream();

第二种方法是executeUpdate()方法。您可以编写一个查询来更改数据库中的某些内容。在这种情况下,Hibernate 在访问数据库时不使用只读事务是必要的。

请求示例:我们决定将所有用户的级别提高 1。


Query<User> query = session.createQuery("update User set level=level+1", User.class);
int count = query.executeUpdate();

executeUpdate()方法将返回实际已修改的行数。

最后第三种方法是scroll()。我们会告诉你更多关于它的信息。

2.3 滚动类方法

这个方法有点类似于stream()方法。只有它允许您在结果列表中移动而根本不拉出结果。也就是说,您可以执行一个查询,然后将其滚动到结果的第百万行并从那里开始读取数据。

如此高级的迭代器。


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();

ScrollableResults对象具有以下方法:

方法 描述
获取() 返回当前元素
下一个() 将指针移动到下一个元素
以前的() 将指针移动到上一个元素
滚动(整数大小) 按大小行向前滚动
位置(int pos) 使元素位置号成为当前元素
最后的() 当前元素现在是最后一个
第一的() 当前元素现在是第一个
获取行号() 返回当前行号
设置行号() 设置当前行号

假设您运行了一个查询并且想要获取最后一个元素。方法如下:


Query<Employee> query = session.createQuery("from Employee where id > 100", Employee.class);
ScrollableResults<Employee> scroll = query.scroll();
scroll.last();
Employee lastEmployee = scroll.get();