스프링 저장소 내에서 원시 SQL을 사용할 수 있습니까?
Spring Data Repository 내에서 원시 SQL을 사용해야 하는데, 가능한가요?주변에 보이는 모든 것@Query
는 항상 엔티티 기반입니다.
@Query 주석에서는 nativeQuery 플래그를 true로 설정하여 네이티브 쿼리를 실행할 수 있습니다.
스프링 데이터 JPA 참조 문서에서 인용합니다.
또한 명명된 네이티브 쿼리를 사용하는 방법에 대한 자세한 내용은 이 섹션을 참조하십시오.
예, 이 작업은 다음과 같은 방법으로 수행할 수 있습니다.
1. Crud Repository (투영)
Spring Data Repository는 쿼리 메서드를 사용할 때 일반적으로 도메인 모델을 반환합니다.그러나 여러 가지 이유로 해당 모델의 보기를 변경해야 할 수도 있습니다.
엔티티가 다음과 같다고 가정합니다.
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;
}
}
현재 프로젝션 클래스는 다음과 같습니다.필요한 필드를 사용할 수 있습니다.
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. Entity Manager 사용
쿼리가 "select id,name from users where roll_no = 1001"이라고 가정합니다.
여기서 쿼리는 ID 및 이름 열을 가진 개체를 반환합니다.응답 클래스는 다음과 같습니다.
응답 클래스는 다음과 같습니다.
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;
}
}
여기서 Bellow 패키지를 Import해야 합니다.
import javax.persistence.Query;
import javax.persistence.EntityManager;
이제 메인 클래스에서는 이 함수를 호출해야 합니다.먼저 Entity Manager를 가져와 호출합니다.getUserByRoll(EntityManager entityManager,String rollNo)
기능.호출 순서는 다음과 같습니다.
Imports는 다음과 같습니다.
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
query는 어레이를 반환하고 어레이는[0] --> id and [1] -> name
.
감사합니다:)
스프링 저장소 내에서 원시 쿼리를 사용할 수 있습니다.
@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);
createNativeQuery("여기서 네이티브 SQL 쿼리")를 사용할 수 있습니다.
예:
Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();
Spring Data JDBC는 Spring Data Commons 위에 구축된 완전히 지원되는 Spring 프로젝트로서 JPA를 사용하지 않고도 원시 SQL을 사용하여 데이터베이스에 액세스할 수 있습니다.
Spring Data JPA에 비해 성능이 떨어지지만, Hibernate와 같은 ORM을 사용하지 않고 간단한 프로젝트를 위한 경량 솔루션을 원한다면 시도해 볼 만한 솔루션입니다.
이렇게 하면 간단한 형태로 사용할 수 있습니다.
@RestController
public class PlaceAPIController {
@Autowired
private EntityManager entityManager;
@RequestMapping(value = "/api/places", method = RequestMethod.GET)
public List<Place> getPlaces() {
List<Place> results = entityManager.createNativeQuery("SELECT * FROM places p limit 10").getResultList();
return results;
}
}
언급URL : https://stackoverflow.com/questions/15948795/is-it-possible-to-use-raw-sql-within-a-spring-repository
'programing' 카테고리의 다른 글
WordPress 게시물의 피처 이미지 URL을 얻는 방법 (0) | 2022.09.22 |
---|---|
Eclipse에서 Maven 종속성을 추가하려면 어떻게 해야 합니까? (0) | 2022.09.22 |
부울 필드 인덱싱 (0) | 2022.09.22 |
Prop 값으로 데이터 속성을 초기화하는 방법 (0) | 2022.09.22 |
명령줄에서 대용량 SQL 파일을 MySql로 가져오는 중 (0) | 2022.09.22 |