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