Spring Data Repository 내에서 원시 SQL을 사용해야합니다. 가능합니까? 내가 보는 모든 것은 @Query
항상 엔티티 기반입니다.
Spring Data Repository 내에서 원시 SQL을 사용해야합니다. 가능합니까? 내가 보는 모든 것은 @Query
항상 엔티티 기반입니다.
답변:
@Query 주석을 사용하면 nativeQuery 플래그를 true로 설정하여 네이티브 쿼리를 실행할 수 있습니다.
SpringData JPA 참조 문서 에서 인용 .
또한 명명 된 네이티브 쿼리로 수행하는 방법에 대한 이 섹션 을 참조하십시오 .
@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
예, 다음 방법으로이 작업을 수행 할 수 있습니다.
1. CrudRepository (투영)
SpringData Repositories는 일반적으로 쿼리 메서드를 사용할 때 도메인 모델을 반환합니다. 그러나 때로는 다양한 이유로 해당 모델의보기를 변경해야 할 수 있습니다.
엔티티가 다음과 같다고 가정합니다.
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;
}
}
이제 Projection 클래스는 다음과 같습니다. 필요한 필드가 될 수 있습니다.
public interface IUserProjection {
int getId();
String getName();
String getRollNo();
}
그리고 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);
}
이제 ArrayList<IUserProjection> findUserUsingRollNo(String rollNo)
사용자 목록을 제공합니다.
2. EntityManager 사용
쿼리가 " select id, name from users where roll_no = 1001 " 이라고 가정합니다 .
여기서 쿼리는 id 및 name 열이있는 개체를 반환합니다. 응답 클래스는 다음과 같습니다.
응답 클래스는 다음과 같습니다.
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;
}
}
여기서 UserObject 생성자는 객체 배열을 얻고 객체로 데이터를 설정합니다.
public UserObject(Object[] columns) {
this.id = (columns[0] != null)?((BigDecimal)columns[0]).intValue():0;
this.name = (String) columns[1];
}
쿼리 실행 기능은 다음과 같습니다.
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;
}
}
여기에서 다음 패키지를 가져와야합니다.
import javax.persistence.Query;
import javax.persistence.EntityManager;
이제 메인 클래스에서이 함수를 호출해야합니다. 먼저 EntityManager를 가져와이 getUserByRoll(EntityManager entityManager,String rollNo)
함수를 호출 합니다. 호출 절차는 다음과 같습니다.
다음은 수입품입니다
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
EntityManager
이 방법에서 얻을 :
@PersistenceContext
private EntityManager entityManager;
UserObject userObject = getUserByRoll(entityManager,"1001");
이제이 userObject에 데이터가 있습니다.
노트 :
query.getSingleResult () 는 객체 배열을 반환합니다. 질의 열 위치로 열 위치와 데이터 유형을 유지해야합니다.
select id,name from users where roll_no = 1001
쿼리는 배열을 반환하며 [0] --> id and [1] -> name
.
감사 :)
사용하는 것도 가능합니다 스프링 데이터 JDBC 저장소 JPA를 사용하지 않고, 원시 SQL과 데이터베이스에 대한 액세스에 봄 데이터 가공의 상단에 내장 커뮤니티 프로젝트입니다.
SpringData JPA보다 덜 강력하지만 Hibernate와 같은 ORM을 사용하지 않고 간단한 프로젝트를위한 경량 솔루션을 원한다면 시도해 볼 가치가있는 솔루션입니다.