java - microsoft - ¿Es posible usar SQL sin procesar dentro de un repositorio de primavera?
microsoft jdbc driver 4.0 for sql server (4)
Necesito usar SQL sin procesar dentro de un Repositorio de datos de primavera, ¿es esto posible? Todo lo que veo en @Query
siempre se basa en las entidades.
La anotación @Query permite ejecutar consultas nativas estableciendo el indicador nativeQuery en verdadero.
Cita de los documentos de referencia de Spring Data JPA.
Además, consulte esta sección sobre cómo hacerlo con una consulta nativa con nombre.
Puedes lograr esto de la siguiente manera:
1. Por CrudRepository (Proyección)
Los repositorios de datos de Spring generalmente devuelven el modelo de dominio cuando usan métodos de consulta. Sin embargo, a veces, puede necesitar modificar la vista de ese modelo por varias razones.
Supongamos que su entidad es así:
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;
}
}
Ahora tu clase de Proyección es como abajo. Puede esos campos que necesitabas.
public interface IUserProjection {
int getId();
String getName();
String getRollNo();
}
Y 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);
}
Ahora ArrayList<IUserProjection> findUserUsingRollNo(String rollNo)
le dará la lista de usuarios.
2. Usando EntityManager
Supongamos que su consulta es " id de selección, nombre de usuarios donde roll_no = 1001 ".
Aquí la consulta devolverá un objeto con id y columna de nombre. Tu clase de respuesta es como abajo:
Tu clase de respuesta es como:
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;
}
}
aquí el constructor UserObject obtendrá una matriz de objetos y establecerá datos con el objeto.
public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}
Su función de ejecución de consulta es como abajo:
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;
}
}
Aquí tiene que importar los siguientes paquetes:
import javax.persistence.Query;
import javax.persistence.EntityManager;
Ahora tu clase principal, tienes que llamar a esta función. Primero obtenga EntityManager y llame a esta función getUserByRoll(EntityManager entityManager,String rollNo)
. El procedimiento de llamada se da a continuación:
Aquí están las importaciones
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
obtener EntityManager
de esta manera:
@PersistenceContext
private EntityManager entityManager;
UserObject userObject = getUserByRoll(entityManager,"1001");
Ahora tiene datos en este userObject.
Nota:
query.getSingleResult () devuelve una matriz de objetos. Debe mantener la posición de columna y el tipo de datos con la posición de columna de consulta.
select id,name from users where roll_no = 1001
consulta devuelve una matriz y es [0] --> id and [1] -> name
.
Más información visita este thread y thread
Gracias :)
También es posible usar el repositorio JDBC de Spring Data , que es un proyecto comunitario construido sobre Spring Data Commons para acceder a las bases de datos con SQL sin procesar, sin usar JPA.
Es menos potente que Spring Data JPA, pero si desea una solución liviana para proyectos simples sin utilizar un ORM como Hibernate, es una solución que vale la pena probar.
podemos usar createNativeQuery ("Aquí Nagitive SQL Query");
por ejemplo :
Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();