REST 查詢語言與 Querydsl Web 支持
這篇文章是系列的一部分
• 使用 Spring 和 JPA Criteria 的 REST 查詢語言
• 使用 Spring Data JPA Specifications 的 REST 查詢語言
• 使用 Spring Data JPA 和 Querydsl 的 REST 查詢語言
• REST 查詢語言 – 高級搜索操作
• REST 查詢語言 – 實現 OR 操作
• 使用 RSQL 的 REST 查詢語言
• 使用 Querydsl Web 支持的 REST 查詢語言 (當前文章)
1. 概述
在本快速教程中,我們將討論 Spring Data Querydsl Web 支持。
這絕對是所有我們之前在 REST Query Language 主系列中關注的其他方法的一種有趣替代方案。
2. Maven 配置
首先,讓我們來看一下我們的 Maven 配置:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-commons</artifactId>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-apt</artifactId>
<version>${querydsl.version}</version>
</dependency>
<dependency>
<groupId>com.mysema.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>${querydsl.version}</version>
</dependency>
...
請注意,Querydsl 的 Web 支持自 spring-data-commons 1.11 版本開始可用
3. 用户存儲庫
接下來,讓我們查看我們的存儲庫:
public interface UserRepository extends
JpaRepository<User, Long>, QueryDslPredicateExecutor<User>, QuerydslBinderCustomizer<QUser> {
@Override
default public void customize(QuerydslBindings bindings, QUser root) {
bindings.bind(String.class).first(
(StringPath path, String value) -> path.containsIgnoreCase(value));
bindings.excluding(root.email);
}
}
請注意:
- 我們正在覆蓋 QuerydslBinderCustomizer customize() 以自定義默認綁定
- 我們正在自定義默認的 equals 綁定,忽略所有 String 屬性的大小寫
- 我們還正在從 Predicate 解決中排除用户的電子郵件
查看完整文檔 這裏.
4. 用户控制器
現在,讓我們來查看一下控制器:
@RequestMapping(method = RequestMethod.GET, value = "/users")
@ResponseBody
public Iterable<User> findAllByWebQuerydsl(
@QuerydslPredicate(root = User.class) Predicate predicate) {
return userRepository.findAll(predicate);
}
這是有趣的部分——注意我們是如何直接從 HttpRequest 中獲取 Predicate 的,使用 @QuerydslPredicate 註解。
一個帶有這種查詢類型的 URL 的樣子是:
http://localhost:8080/users?firstName=john
潛在的響應結構如下:
[
{
"id":1,
"firstName":"john",
"lastName":"doe",
"email":"[email protected]",
"age":11
}
]
5. 實時測試
最後,讓我們測試新的 Querydsl Web 支持:
@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = Application.class)
@WebAppConfiguration
public class UserLiveTest {
private ObjectMapper mapper = new ObjectMapper();
private User userJohn = new User("john", "doe", "[email protected]");
private User userTom = new User("tom", "doe", "[email protected]");
private static boolean setupDataCreated = false;
@Before
public void setupData() throws JsonProcessingException {
if (!setupDataCreated) {
givenAuth().contentType(MediaType.APPLICATION_JSON_VALUE)
.body(mapper.writeValueAsString(userJohn))
.post("http://localhost:8080/users");
givenAuth().contentType(MediaType.APPLICATION_JSON_VALUE)
.body(mapper.writeValueAsString(userTom))
.post("http://localhost:8080/users");
setupDataCreated = true;
}
}
private RequestSpecification givenAuth() {
return RestAssured.given().auth().preemptive().basic("user1", "user1Pass");
}
}
首先,讓我們獲取系統中所有用户:
@Test
public void whenGettingListOfUsers_thenCorrect() {
Response response = givenAuth().get("http://localhost:8080/users");
User[] result = response.as(User[].class);
assertEquals(result.length, 2);
}
接下來,讓我們根據 名字 查找用户:
@Test
public void givenFirstName_whenGettingListOfUsers_thenCorrect() {
Response response = givenAuth().get("http://localhost:8080/users?firstName=john");
User[] result = response.as(User[].class);
assertEquals(result.length, 1);
assertEquals(result[0].getEmail(), userJohn.getEmail());
}
接下來,讓我們根據 姓氏的一部分 查找用户:
@Test
public void givenPartialLastName_whenGettingListOfUsers_thenCorrect() {
Response response = givenAuth().get("http://localhost:8080/users?lastName=do");
User[] result = response.as(User[].class);
assertEquals(result.length, 2);
}
現在,讓我們嘗試根據 電子郵件 查找用户:
@Test
public void givenEmail_whenGettingListOfUsers_thenIgnored() {
Response response = givenAuth().get("http://localhost:8080/users?email=john");
User[] result = response.as(User[].class);
assertEquals(result.length, 2);
}
注意:當我們嘗試通過電子郵件查找用户時,查詢將被忽略,因為我們從 Predicate 解決中排除了用户的電子郵件。
6. 結論
在本文中,我們快速介紹了 Spring Data Querydsl Web 支持以及從 HTTP 請求中直接獲取
Predicate 的一種簡單方法,並利用它來檢索數據。
0 位用戶收藏了這個故事!