Tôi cần sử dụng SQL thô trong Kho lưu trữ dữ liệu mùa xuân, điều này có khả thi không? Mọi thứ tôi thấy xung quanh @Query
luôn dựa trên thực thể.
Tôi cần sử dụng SQL thô trong Kho lưu trữ dữ liệu mùa xuân, điều này có khả thi không? Mọi thứ tôi thấy xung quanh @Query
luôn dựa trên thực thể.
Câu trả lời:
Chú thích @Query cho phép thực thi các truy vấn gốc bằng cách đặt cờ nativeQuery thành true.
Trích dẫn từ tài liệu tham khảo Spring Data JPA .
Ngoài ra, hãy xem phần này về cách thực hiện với truy vấn gốc được đặt tên.
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
CÓ, Bạn có thể thực hiện việc này theo những cách sau:
1. Bởi CrudRepository (Projection)
Kho lưu trữ Dữ liệu Mùa xuân thường trả về mô hình miền khi sử dụng các phương pháp truy vấn. Tuy nhiên, đôi khi, bạn có thể cần phải thay đổi chế độ xem của mô hình đó vì nhiều lý do khác nhau.
Giả sử thực thể của bạn giống như sau:
import javax.persistence.*;
import java.math.BigDecimal;
@Entity
@Table(name = "USER_INFO_TEST")
public class UserInfoTest {
private int id;
private String name;
private String rollNo;
public UserInfoTest() {
}
public UserInfoTest(int id, String name) {
this.id = id;
this.name = name;
}
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable = false, precision = 0)
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Basic
@Column(name = "name", nullable = true)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Basic
@Column(name = "roll_no", nullable = true)
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
}
Bây giờ lớp Projection của bạn giống như dưới đây. Nó có thể những trường mà bạn cần.
public interface IUserProjection {
int getId();
String getName();
String getRollNo();
}
Và Your Data Access Object(Dao) is like bellow
:
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import java.util.ArrayList;
public interface UserInfoTestDao extends CrudRepository<UserInfoTest,Integer> {
@Query(value = "select id,name,roll_no from USER_INFO_TEST where rollNo = ?1", nativeQuery = true)
ArrayList<IUserProjection> findUserUsingRollNo(String rollNo);
}
Bây giờ ArrayList<IUserProjection> findUserUsingRollNo(String rollNo)
sẽ cung cấp cho bạn danh sách người dùng.
2. Sử dụng EntityManager
Giả sử truy vấn của bạn là " chọn id, tên từ những người dùng mà roll_no = 1001 ".
Ở đây truy vấn sẽ trả về một đối tượng có id và cột tên. Lớp Phản hồi của bạn giống như dưới đây:
Lớp Phản hồi của bạn giống như:
public class UserObject{
int id;
String name;
String rollNo;
public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getRollNo() {
return rollNo;
}
public void setRollNo(String rollNo) {
this.rollNo = rollNo;
}
}
ở đây hàm khởi tạo UserObject sẽ lấy một Mảng đối tượng và thiết lập dữ liệu với đối tượng.
public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}
Hàm thực thi truy vấn của bạn giống như dưới đây:
public UserObject getUserByRoll(EntityManager entityManager,String rollNo) {
String queryStr = "select id,name from users where roll_no = ?1";
try {
Query query = entityManager.createNativeQuery(queryStr);
query.setParameter(1, rollNo);
return new UserObject((Object[]) query.getSingleResult());
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
Ở đây bạn phải nhập các gói dưới đây:
import javax.persistence.Query;
import javax.persistence.EntityManager;
Bây giờ lớp chính của bạn, bạn phải gọi hàm này. Đầu tiên hãy lấy EntityManager và gọi getUserByRoll(EntityManager entityManager,String rollNo)
hàm này . Thủ tục gọi điện được đưa ra dưới đây:
Đây là nhập khẩu
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
nhận được EntityManager
từ cách này:
@PersistenceContext
private EntityManager entityManager;
UserObject userObject = getUserByRoll(entityManager,"1001");
Bây giờ bạn có dữ liệu trong userObject này.
Ghi chú:
query.getSingleResult () trả về một mảng đối tượng. Bạn phải duy trì vị trí cột và kiểu dữ liệu với vị trí cột truy vấn.
select id,name from users where roll_no = 1001
truy vấn trả về một mảng và nó [0] --> id and [1] -> name
.
Thêm thông tin truy cập chuỗi này và chuỗi này
Cảm ơn :)
Cũng có thể sử dụng kho lưu trữ JDBC của Spring Data , đây là một dự án cộng đồng được xây dựng trên Spring Data Commons để truy cập vào cơ sở dữ liệu bằng SQL thô mà không cần sử dụng JPA.
Nó kém mạnh mẽ hơn Spring Data JPA, nhưng nếu bạn muốn giải pháp nhẹ cho các dự án đơn giản mà không sử dụng ORM như Hibernate, thì đó là một giải pháp đáng để thử.
chúng ta có thể sử dụng createNativeQuery ("Đây là Truy vấn SQL Nagitive");
ví dụ :
Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();
em
biến.
Có thể sử dụng truy vấn thô trong Kho lưu trữ mùa xuân.
@Query(value = "SELECT A.IS_MUTUAL_AID FROM planex AS A
INNER JOIN planex_rel AS B ON A.PLANEX_ID=B.PLANEX_ID
WHERE B.GOOD_ID = :goodId",nativeQuery = true)
Boolean mutualAidFlag(@Param("goodId")Integer goodId);