Chào các em ,chủ để hôm nay chúng ta sẽ tìm hiểu về các cách để Spring JPA query trong lập trình Spring
Giả sử ta có ta viết một chương trình quản lý nhân sự ở một công ty. Thường ở một công ty sẽ có các phòng ban như : Phòng kế toán, phòng đào tạo, phòng nhân sự. Tại mỗi phòng ban sẽ có các nhân viên thuộc phòng ban đó. Ví dụ ta có entity Phòng ban như sau.
@Query(value="SELECT * FROM PhongBan phongban WHERE phongban.status = 1",nativeQuery=true)Collection<PhongBan>findAllPhongBan();
Để sử dung câu query thuần giống như ta thực hiện câu select trong database thì mình thêm tham số nativeQuery = true
Tham số Index trong câu Query
1
2
@Query("select phongban from PhongBan phongban where phongban.name = ?1")PhongBanfindByName(Stringtenphongban);
Chúng ta dùng ?1 tương ứng với tham số đầu tiên trong method findByName. ?1 sẽ được ánh xạ bằng tham số String tenphongban. Nếu
chúng ta có nhiều tham số ví dụ
1
2
@Query("select phongban from PhongBan phongban where phongban.name = ?1"andphongban.code=?2)PhongBanfindByName(Stringtenphongban,intcode);
Lúc đó ?1 sẽ bằng tham số tenphongban và ?2 bằng code. Như vậy dùng ? để chỉ ra thứ tự các tham số trong method tương ứng với vị trí trong câu query
Tham số Name trong câu Query
1
2
@Query("SELECT nguoidung FROM NguoiDung nguoidung WHERE nguoidung.status = :status and nguoidung.name = :name")UserfindUserByStatusAndNameNamedParams(@Param("status")Integerstatus,@Param("name")Stringname);
Nó cũng giống na ná như Index query thay vì sử dụng vị trí (index), thì ta sử dung cái tên . Ví dụ trên ta sử dụng :status , :name để ánh xạ vào đúng tên (@Param(“status”) Integer status, @Param(“name”) String name) trong phương thức. Chú ý là ta sử dụng thêm @Param để ánh xạ tên method và tên trong @Query giống nhau
Collection Parameter
Trong database chúng ta có toán tử IN và NOT IN như sau
Để sử dụng được toán tử IN trong JPQL Query thì ta sử dụng tham số là Collection như sau
1
2
@Query(value="SELECT nguoidung FROM NguoiDung nguoidung WHERE nguoidung.name IN :names")List<User>findUserByNameList(@Param("names")Collection<String>names);
2. Sử dung Query Creation
Spring Data JPA hỗ trở cho chúng ta sẳn các phương thức để truy cập xuống database. Chúng ta chỉ cần kế thừa JPARepository và sau đó có thể sử dụng các phương thức mà JPA cung cấp đề lấy dữ liệu từ database.
Trong đó findBy là từ khoá mà JPA cung cấp cho mình sau từ findBy là tên column có trong database. Ví dụ findByName tìm kiếm các user có tên là tham số name truyền vào. Trong đó findBy là từ khoá của JPA và Name chính là tên column trong database. Ngoài findBy thì JPA còn hỗ trợ nhiều phương thức khác nữa có thể xem ở đây
3. Sử dung @NameQuery trong Entiry
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@Entity@Table(name="NhanVien")@NamedQuery(name="NhanVien.fetchByLastNameLength",query="SELECT e FROM NhanVien e WHERE CHAR_LENGTH(e.lastname) =:length ")publicclassNhanVien{@Id@Column(name="id")@GeneratedValue(strategy=GenerationType.SEQUENCE)privateLongid;@Column(name="firstname")privateStringfirstName;@Column(name="lastname")privateStringlastname;}
Như các em thấy trong Class Entity mình sử dụng @NameQuery để tạo câu lệnh select. Chú ý cho anh chổ @NamedQuery(name = “NhanVien.fetchByLastNameLength”) Để gọi được câu lệnh này thì nơi chỗ JPA Repository ta phải có phương thức (fetchByLastNameLength) giống y chang vậy.
Dòng new Sort(Sort.Direction.ASC, “name”) nghĩa là chúng ta muốn sắp xếp dữ liệu ở cột name theo chiều hướng tăng dần. Nếu muốn sắp xếp name theo chiều hướng giảm dần thì ta dùng new Sort(Sort.Direction.DESC, “name”)
5. Sử dụng annotation @Modifying để cập nhật dữ liệu
1
2
3
4
@Modifying@Query("update NhanVien nhanvien set nhanvien.status = :status where nhanvien.name = :name")intupdateUser(@Param("status")Integerstatus,@Param("name")Stringname);
Kết quả trả về là bao nhiêu dòng trong database được cập nhật. Chúng ta cũng có thể sử dụng Native Query để cập nhật như sau
1
2
3
4
@Modifying@Query(value="update NhanVien nhanvien set nhanvien.status where nhanvien.name = ?",nativeQuery=true)intupdateUserNative(Integerstatus,Stringname);
6. Sử dụng annotation @Modifying để insert dữ liệu
Trong spring data jpa chúng ta dùng hàm save() có sẳn để insert dữ liệu xuống database. Trong trường hợp dùng native query thì chúng ta phải kết hợp @Modifiying và câu lệnh Insert chung với nhau vì Spring Data JPA chúng ta đang dùng không hổ trợ Insert
Chúng ta sử dụng Pageable để lấy một tập hợp con trong database. Ví dụ như trong database có 100 dòng. Ta chỉ muốn lấy từ dùng 1 cho tới dòng 10. Để làm được như vậy chúng ta sẽ sử dụng đối tượng PageRequestObject để khai báo số lượng dòng mà ta muốn trả về , sau đó truyền đối tượng PageRequestObject vào câu lệnh truy vấn.