Spring Data Repository 내에서 원시 SQL을 사용해야합니다. 가능합니까? 내가 보는 모든 것은 @Query항상 엔티티 기반입니다.
답변
@Query 주석을 사용하면 nativeQuery 플래그를 true로 설정하여 네이티브 쿼리를 실행할 수 있습니다.
SpringData JPA 참조 문서 에서 인용 .
또한 명명 된 네이티브 쿼리로 수행하는 방법에 대한 이 섹션 을 참조하십시오 .
답변
예, 다음 방법으로이 작업을 수행 할 수 있습니다.
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을 사용하지 않고 간단한 프로젝트를위한 경량 솔루션을 원한다면 시도해 볼 가치가있는 솔루션입니다.
답변
createNativeQuery ( “Here Nagitive SQL Query”);를 사용할 수 있습니다.
예 :
Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();답변
Spring Repository 내에서 원시 쿼리를 사용할 수 있습니다.
      @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);