Spring JPA 擴充
本節記錄了一組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配置,將SpringDataWebConfiguration
或HateoasAwareSpringDataWebConfiguration
註冊為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
的配置註冊了幾個基本元件:
DomainClassConverter
讓Spring 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
的例項。註冊使Pageable
和Sort
成為有效的控制器方法引數,如下面的示例所示:
例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("<-->");
}