Apakah mungkin menggunakan SQL mentah dalam Spring Repository

112

Saya perlu menggunakan SQL mentah dalam Spring Data Repository, apakah ini mungkin? Semua yang saya lihat di sekitar @Queryselalu berbasis entitas.

Webnet
sumber
Akankah SqlQuery melakukannya? static.springsource.org/spring/docs/2.5.x/api
Chetter Hummin
Bagaimana saya bisa menggunakannya dalam repositori? Atau apakah saya tidak akan menggunakan repo dan hanya menggunakan objek itu dalam layanan saya?
Webnet
Apakah Anda menggunakan spring-data-jpa?
zagyi
@Webnet Saya sendiri agak baru mengenal Spring, tetapi menurut saya Anda dapat menggunakannya sebagai objek
Chetter Hummin
Sudahkah Anda mencoba Spring JDBCTemplate?
BlackJoker

Jawaban:

133

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.

zagyi
sumber
13
@ user454322, parameter dimulai dengan 1, jadi:@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
Jacob van Lingen
nativeQuery = true menyelamatkan saya dari IllegalArgumentException
Reza
45

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 EntityManagerdari 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 :)

Md. Sajedul Karim
sumber
3

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.

Sébastien Deleuze
sumber
3

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();
Lova Chittumuri
sumber
9
Akan berguna / lengkap jika Anda juga menunjukkan cara membuat emvariabel.
ETL
1

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);
Abdur Rahman
sumber