Xóa bài viết
Bạn có chắc chắn muốn xóa bài viết này không ?
Xóa bình luận
Bạn có chắc chắn muốn xóa bình luận này không ?
[Spring boot] Viết api query string đơn giản hơn với querydsl
- Nhân ngày không khí lạnh về, ngồi nhà lại rảnh rồi nên mình lượn 1 vòng trên mạng thấy cái thư viện này hay hay, nên mang về giới thiệu qua cho các bạn
- Cái thư viện này đại khái là cho phép tạo ra các truy vấn kiểu an toàn theo cú pháp tương tự như SQL (mình google translate nguyên câu nó thế
) còn an toàn như nào thì các bạn lên doc của nó đọc thêm ở đây http://www.querydsl.com/static/querydsl/4.2.1/reference/html/index.html
Thí dụ như tiêu đề
- Bình thường trong spring khi có một cái api string kiểu này domain/api/user?username=xyz&address=zyx&password=yzx thì thì mình sẽ viết cái api kiểu kiểu như này
@GetMapping
public List<User> findAll(@RequestParam(required = false) String username, @RequestParam(required = false) String address, @RequestParam(required = false) String password) {
return repository.findAll(username, address, password);
}
- Và trong repository thì nó sẽ như này
@Query("FROM User t1 " +
"WHERE :username IS NULL OR t1.username = :username " +
"AND :address IS NULL OR t1.address = :address " +
"AND :password IS NULL OR t1.password = :password")
List<User> findAll(String username, String address, String password);
- Cái vấn đề ở đây khi mình cần thêm trường mới vào như phone, email thì sẽ phải thêm ở nhiều chỗ rồi phải sửa query,... blabla
Rồi bây giờ ta dùng thêm thằng querydsl
- Đầu tiên ta cần thêm thư viện
<dependency>
<groupId>com.querydsl</groupId>
<artifactId>querydsl-jpa</artifactId>
<version>4.4.0</version>
</dependency>
- Rồi thêm cái plugin
<plugin>
<groupId>com.mysema.maven</groupId>
<artifactId>apt-maven-plugin</artifactId>
<version>1.1.3</version>
<executions>
<execution>
<goals>
<goal>process</goal>
</goals>
<configuration>
<outputDirectory>target/generated-sources/java</outputDirectory>
<processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
</configuration>
</execution>
</executions>
</plugin>
- Rồi trong repository mình extends thêm QuerydslPredicateExecutor
public interface UserRepository extends JpaRepository<User, Integer>, QuerydslPredicateExecutor<User>
- Ngoài controller thì sẽ mình thêm pageable để phân trang luôn nhé
@GetMapping("/user")
public Page<User> filter(@QuerydslPredicate(root = User.class) Predicate predicate, Pageable pageable) {
return repository.findAll(predicate, pageable);
}
- Code nó có vậy thôi, giờ mình có thêm trường mới cho user, thì dưới client cũng có thể dùng query string vào được luôn, mình không cần sửa query hay method nào nữa cả
- Để join bảng này nọ thì mình có thể custom lại chút là được.
Các bạn có thể tạo một class khác để maping với query string thay vì dùng entity để tránh lộ cấu trúc bảng hay những thư đại khái như vậy nhé
Nếu có cái gì hay về thư viện hay nữa các bạn có thể chia sẻ thêm cho mình biết với nhé. Đây là source demo của mình https://github.com/hunghhdev/guide/tree/master/spring-boot/query-string-with-querydsl
Cảm ơn các bạn đã dành thời gian đọc bài viết của mình
Bình luận

{{ comment.user.name }}
Bỏ hay
Hay

Cùng một tác giả

8
0
Xin chào các bạn đọc, trong seri này mình dự định sẽ chia sẻ cách dùng spring security để phân quyền trong web service, cách đọc ghi một JWT, rồi t...

7
1
Restful api Rest (Representational State Transfer) hiểu nôm na nó là một kiểu kiến trúc được dùng để giao tiếp giữa các máy tính, được truyền tải...

4
0
Ở (Link) mình đã tạo một số model và tạo thử một api register, ở phần này mình sẽ hướng dẫn các bạn tạo một chuỗi JWT và khi login sẽ chả về cái ch...
Bài viết liên quan

0
0
Giới thiệu Trong bài hôm nay chúng ta sẽ tìm hiểu cách handle request POST của Spring Boot. Trước đó, bạn nên biết 1. 「Spring Boot 8」Tạo Web He...

1
0
Giới thiệu Yêu cầu bạn phải đọc bài viết về @Conditional trước: 1. Spring Boot] Hướng dẫn tạo Bean có điều kiện với @Conditional]lin...