[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ế :bowtie: ) 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 :disappointed_relieved:

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ả :sweat_smile: :sweat_smile: :sweat_smile:
  • Để 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é :stuck_out_tongue:

  • 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 :two_hearts: :two_hearts: :two_hearts:

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

White

hunghh.dev

9 bài viết.
12 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
White
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...
hunghh.dev viết 1 năm trước
8 0
White
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...
hunghh.dev viết 1 năm trước
7 1
White
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...
hunghh.dev viết 1 năm trước
4 0
Bài viết liên quan
White
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...
https://loda.me viết gần 2 năm trước
0 0
White
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...
https://loda.me viết gần 2 năm trước
1 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


White
{{userFollowed ? 'Following' : 'Follow'}}
9 bài viết.
12 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!