1.4.7。异步查询结果
可以使用Spring的异步方法执行功能异步运行存储库查询。这意味着该方法在调用时立即返回,而实际的查询执行发生在已提交给Spring的任务中TaskExecutor。异步查询执行与响应式查询执行不同,不应混合使用。有关反应支持的更多详细信息,请参阅特定于商店的文档。以下示例显示了许多异步查询:
@Async
Future<User> findByFirstname(String firstname);
@Async
CompletableFuture<User> findOneByFirstname(String firstname);
@Async
ListenableFuture<User> findOneByLastname(String lastname);
使用java.util.concurrent.Future作为返回类型。
使用Java 8 java.util.concurrent.CompletableFuture作为返回类型。
使用a org.springframework.util.concurrent.ListenableFuture作为返回类型。
1.8。Spring Data Extensions
本节介绍了一组Spring Data扩展,它们可以在各种上下文中使用Spring Data。目前,大多数集成都针对Spring MVC。
1.8.1。Querydsl扩展
Querydsl是一个框架,可以通过其流畅的API构建静态类型的SQL类查询。
几个Spring Data模块提供与Querydsl的集成QuerydslPredicateExecutor,如以下示例所示:
示例37. QuerydslPredicateExecutor接口
public interface QuerydslPredicateExecutor<T> {
Optional<T> findById(Predicate predicate);
Iterable<T> findAll(Predicate predicate);
long count(Predicate predicate);
boolean exists(Predicate predicate);
// … more functionality omitted.
}
查找并返回与之匹配的单个实体Predicate。
查找并返回与之匹配的所有实体Predicate。
返回匹配的实体数Predicate。
返回与Predicateexists 匹配的实体。
要使用Querydsl支持,请QuerydslPredicateExecutor在存储库界面上进行扩展,如以下示例所示
示例38.存储库上的Querydsl集成
interface UserRepository extends CrudRepository<User, Long>, QuerydslPredicateExecutor<User> {
}
前面的示例允许您使用Querydsl Predicate实例编写类型安全查询,如以下示例所示:
Predicate predicate = user.firstname.equalsIgnoreCase("dave")
.and(user.lastname.startsWithIgnoreCase("mathews"));
userRepository.findAll(predicate);
示例39.启用Spring Data Web支持
支持存储库编程模型的Spring Data模块具有各种Web支持。与Web相关的组件需要Spring MVC JAR位于类路径上。其中一些甚至提供与Spring HATEOAS的集成。通常,通过@EnableSpringDataWebSupport在JavaConfig配置类中使用注释来启用集成支持,如以下示例所示:
@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
class WebConfiguration {}
示例41.在方法签名中使用域类型的Spring MVC控制器
@Controller
@RequestMapping("/users")
class UserController {
@RequestMapping("/{id}")
String showUserForm(@PathVariable("id") User user, Model model) {
model.addAttribute("user", user);
return "userForm";
}
}
如您所见,该方法User直接接收实例,无需进一步查找。可以通过让Spring MVC首先将路径变量转换为id域类的类型来解析实例,并最终通过调用findById(…)为域类型注册的存储库实例来访问实例。
示例42.使用Pageable作为控制器方法参数
@Controller
@RequestMapping("/users")
class UserController {
private final UserRepository repository;
UserController(UserRepository repository) {
this.repository = repository;
}
@RequestMapping
String showUsers(Model model, Pageable pageable) {
model.addAttribute("users", repository.findAll(pageable));
return "users";
}
}
前面的方法签名导致Spring MVC尝试Pageable使用以下默认配置从请求参数派生实例:
表1.为Pageable实例评估的请求参数
page | 您要检索的页面。0索引并默认为0。 |
size | 要检索的页面大小。默认为20。 |
sort | 应按格式排序的属性property,property(,ASC |