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();
GO TO FULL VERSION