[java] Spring Repository 내에서 원시 SQL을 사용할 수 있습니까?

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);


답변