È possibile utilizzare SQL grezzo all'interno di un repository Spring


112

Ho bisogno di utilizzare SQL grezzo all'interno di un repository Spring Data, è possibile? Tutto quello che vedo in giro @Queryè sempre basato sull'entità.



Come potrei usarlo all'interno di un repository? O non userei un repo e userei semplicemente quell'oggetto all'interno del mio servizio?
Webnet

Usi spring-data-jpa?
zagyi

@Webnet Io stesso sono un po 'nuovo per Spring, ma mi sembra che potresti usarlo come oggetto
Chetter Hummin

hai provato Spring JDBCTemplate?
BlackJoker

Risposte:


133

L'annotazione @Query consente di eseguire query native impostando il flag nativeQuery su true.

Citazione dai documenti di riferimento dell'APP Spring Data .

Inoltre, vedere questa sezione su come farlo con una query nativa denominata.


13
@ user454322, i parametri iniziano con 1, quindi è:@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
Jacob van Lingen

nativeQuery = true mi ha salvato da IllegalArgumentException
Reza il

45

SÌ, puoi farlo nei seguenti modi:

1. Di CrudRepository (proiezione)

I repository di dati Spring in genere restituiscono il modello di dominio quando si utilizzano metodi di query. Tuttavia, a volte, potrebbe essere necessario modificare la visualizzazione di quel modello per vari motivi.

Supponi che la tua entità sia così:

    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;
        }
    }

Ora la tua lezione di proiezione è come sotto. Può quei campi di cui avevi bisogno.

public interface IUserProjection {
     int getId();
     String getName();
     String getRollNo();
}

E 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);
}

Ora ArrayList<IUserProjection> findUserUsingRollNo(String rollNo)ti darà l'elenco degli utenti.

2. Utilizzo di EntityManager

Supponiamo che la tua query sia " seleziona id, nome dagli utenti dove roll_no = 1001 ".

Qui la query restituirà un oggetto con id e nome colonna. La tua classe di risposta è come di seguito:

La tua classe di risposta è come:

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;
        }
    }

qui il costruttore UserObject otterrà un Object Array e imposterà i dati con object.

public UserObject(Object[] columns) {
            this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
            this.name = (String) columns[1];
        }

La tua funzione di esecuzione della query è come di seguito:

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;
        }
    }

Qui devi importare i seguenti pacchetti:

import javax.persistence.Query;
import javax.persistence.EntityManager;

Ora la tua classe principale, devi chiamare questa funzione. Per prima cosa ottieni EntityManager e chiama questa getUserByRoll(EntityManager entityManager,String rollNo)funzione. La procedura di chiamata è indicata di seguito:

Ecco le importazioni

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

ottenere EntityManagerda questo modo:

@PersistenceContext
private EntityManager entityManager;

UserObject userObject = getUserByRoll(entityManager,"1001");

Ora hai dati in questo userObject.

Nota:

query.getSingleResult () restituisce un array di oggetti. È necessario mantenere la posizione della colonna e il tipo di dati con la posizione della colonna della query.

select id,name from users where roll_no = 1001 

query restituisce un array ed è [0] --> id and [1] -> name.

Maggiori informazioni visita questo thread e questo thread

Grazie :)


3

È anche possibile utilizzare il repository JDBC di Spring Data , un progetto della comunità costruito su Spring Data Commons per accedere ai database con SQL grezzo, senza utilizzare JPA.

È meno potente di Spring Data JPA, ma se desideri una soluzione leggera per progetti semplici senza utilizzare un ORM come Hibernate, vale la pena provare.


3

possiamo usare createNativeQuery ("Here Nagitive SQL Query");

per esempio :

Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();

9
Sarebbe utile / completo se mostrassi anche come creare la emvariabile.
ETL

1

È possibile utilizzare query non elaborate all'interno di un repository Spring.

      @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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.