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à.
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à.
Risposte:
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.
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
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 EntityManager
da 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 :)
È 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.
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();
em
variabile.
È 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);