Spring JPA 擴充

Kindear_chen發表於2020-09-07

Spring JPA 擴充

翻譯:Spring Data Extensions

本節記錄了一組Spring資料擴充套件,它們支援在各種上下文中使用Spring資料。目前,大部分整合都是針對Spring MVC的。

1、Querydsl 擴充

Querydsl是一個框架,它支援通過其連貫的的API構造靜態型別的sql類查詢。

有幾個Spring資料模組通過QuerydslPredicateExecutor提供與Querydsl的整合,如下面的示例所示:

例43: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.
}

謂詞的用法

要利用Querydsl支援,請在您的儲存庫介面上擴充套件QuerydslPredicateExecutor,如下面的示例所示:

例44:在儲存庫中整合Querydsl

interface UserRepository extends CrudRepository<User, Long>, QuerydslPredicateExecutor<User> {
}

前面的示例允許您使用Querydsl謂詞例項編寫型別安全的查詢,如下面的示例所示:

Predicate predicate = user.firstname.equalsIgnoreCase("dave")
	.and(user.lastname.startsWithIgnoreCase("mathews"));

userRepository.findAll(predicate);

2、Web支援

本節包含Spring Data web支援的文件,因為它是在Spring Data Commons的當前(及以後)版本中實現的。由於新引入的支援改變了很多東西,所以我們在web.legacy中保留了以前的行為文件。

例45:使Spring資料支援web

@Configuration
@EnableWebMvc
@EnableSpringDataWebSupport
class WebConfiguration {}

@EnableSpringDataWebSupport註釋註冊了一些我們稍後將討論的元件。它還將檢測類路徑上的Spring HATEOAS,併為其註冊整合元件(如果存在的話)。

或者,如果您使用XML配置,將SpringDataWebConfigurationHateoasAwareSpringDataWebConfiguration註冊為Spring bean,如下面的示例所示(例如SpringDataWebConfiguration)

例46:啟用XML中的Spring Data web支援

<bean class="org.springframework.data.web.config.SpringDataWebConfiguration" />

<!-- If you use Spring HATEOAS, register this one *instead* of the former -->
<bean class="org.springframework.data.web.config.HateoasAwareSpringDataWebConfiguration" />

基礎Web支援

上一節中展示@EnableSpringDataWebSupport的配置註冊了幾個基本元件:

  • DomainClassConverterSpring MVC從請求引數或路徑變數中解析儲存庫管理的域類的例項。
  • HandlerMethodArgumentResolver實現,讓Spring MVC從請求引數中解析可分頁和排序例項。

DomainClassConverter允許您在Spring MVC控制器方法簽名中直接使用域型別,因此您不需要通過儲存庫手動查詢例項,如下面的示例所示:

例47:在方法簽名中使用域型別的Spring MVC控制器

@Controller
@RequestMapping("/users")
class UserController {

  @RequestMapping("/{id}")
  String showUserForm(@PathVariable("id") User user, Model model) {

    model.addAttribute("user", user);
    return "userForm";
  }
}

如您所見,該方法直接接收使用者例項,不需要進一步查詢。通過讓Spring MVC首先將path變數轉換為域類的id型別,並最終通過呼叫為域型別註冊的儲存庫例項的findById()來訪問該例項,可以解析該例項。

目前,儲存庫必須實現CrudRepository才能被發現進行轉換。

用於可分頁和排序的HandlerMethodArgumentResolvers

​ 上一節中顯示的配置片段還註冊了一個PageableHandlerMethodArgumentResolver以及SortHandlerMethodArgumentResolver的例項。註冊使PageableSort成為有效的控制器方法引數,如下面的示例所示:

例48:使用分頁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嘗試使用以下預設配置從請求引數派生一個可分頁例項:

表1:Pageable 請求引數配置

引數名稱 預設配置
page 您想要檢索的頁面,索引為0,預設值為0。
size 要檢索的頁面的大小,預設為20。
sort 排序屬性,遵循property,property(,ASC|DESC)(,IgnoreCase)的格式,預設的排序是區分大小寫的升序排序使用多個排序引數,如果你想切換方向或大小寫敏感性,例如sort=firstname&sort=lastname,asc&sort=city,ignorecase

​ 要自定義這個行為,需要註冊一個實現PageableHandlerMethodArgumentResolverCustomizer介面或SortHandlerMethodArgumentResolverCustomizer介面的bean。它的customize()方法將被呼叫,從而允許您更改設定,如下面的示例所示:

@Bean SortHandlerMethodArgumentResolverCustomizer sortCustomizer() {
    return s -> s.setPropertyDelimiter("<-->");
}

相關文章