Saya perlu menggunakan SQL mentah dalam Spring Data Repository, apakah ini mungkin? Semua yang saya lihat di sekitar @Query
selalu berbasis entitas.
Saya perlu menggunakan SQL mentah dalam Spring Data Repository, apakah ini mungkin? Semua yang saya lihat di sekitar @Query
selalu berbasis entitas.
Jawaban:
Anotasi @Query memungkinkan untuk mengeksekusi kueri native dengan menyetel flag nativeQuery ke true.
Kutipan dari dokumen referensi JPA Spring Data .
Juga, lihat bagian ini tentang cara melakukannya dengan kueri asli bernama.
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
YA, Anda dapat melakukan ini dengan cara berikut:
1. Dengan CrudRepository (Proyeksi)
Spring Data Repositories biasanya mengembalikan model domain saat menggunakan metode kueri. Namun, terkadang, Anda mungkin perlu mengubah tampilan model tersebut karena berbagai alasan.
Misalkan entitas Anda seperti ini:
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;
}
}
Sekarang kelas Proyeksi Anda seperti di bawah ini. Itu bisa bidang-bidang yang Anda butuhkan.
public interface IUserProjection {
int getId();
String getName();
String getRollNo();
}
Dan 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);
}
Sekarang ArrayList<IUserProjection> findUserUsingRollNo(String rollNo)
akan memberi Anda daftar pengguna.
2. Menggunakan EntityManager
Misalkan kueri Anda adalah " pilih id, nama dari pengguna di mana roll_no = 1001 ".
Di sini query akan mengembalikan objek dengan kolom id dan nama. Kelas Respon Anda seperti di bawah ini:
Kelas Respon Anda seperti:
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;
}
}
Disini konstruktor UserObject akan mendapatkan Object Array dan mengatur data dengan objek.
public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}
Fungsi eksekusi kueri Anda seperti di bawah ini:
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;
}
}
Di sini Anda harus mengimpor paket di bawah ini:
import javax.persistence.Query;
import javax.persistence.EntityManager;
Sekarang kelas utama Anda, Anda harus memanggil fungsi ini. Pertama, dapatkan EntityManager dan panggil getUserByRoll(EntityManager entityManager,String rollNo)
fungsi ini . Prosedur panggilan diberikan di bawah ini:
Ini Impornya
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
dapatkan EntityManager
dari cara ini:
@PersistenceContext
private EntityManager entityManager;
UserObject userObject = getUserByRoll(entityManager,"1001");
Sekarang Anda memiliki data di userObject ini.
catatan:
query.getSingleResult () mengembalikan larik objek. Anda harus mempertahankan posisi kolom dan tipe data dengan posisi kolom query.
select id,name from users where roll_no = 1001
query mengembalikan array dan itu [0] --> id and [1] -> name
.
Info lebih lanjut kunjungi utas ini dan utas ini
Terima kasih :)
Dimungkinkan juga untuk menggunakan repositori JDBC Spring Data , yang merupakan proyek komunitas yang dibangun di atas Spring Data Commons untuk mengakses database dengan SQL mentah, tanpa menggunakan JPA.
Ini kurang kuat dari Spring Data JPA, tetapi jika Anda menginginkan solusi ringan untuk proyek sederhana tanpa menggunakan ORM seperti Hibernate, solusi tersebut layak untuk dicoba.
kita bisa menggunakan createNativeQuery ("Disini Nagitive SQL Query");
sebagai contoh :
Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();
em
variabel.
Dimungkinkan untuk menggunakan kueri mentah dalam Spring Repository.
@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);