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


112

Spring Data Repository 내에서 원시 SQL을 사용해야합니다. 가능합니까? 내가 보는 모든 것은 @Query항상 엔티티 기반입니다.



저장소 내에서 어떻게 사용할 수 있습니까? 아니면 리포지토리를 사용하지 않고 내 서비스 내에서 해당 객체를 사용합니까?
Webnet

spring-data-jpa를 사용합니까?
zagyi

@Webnet 나 자신을 봄에 새로운 비트를 해요,하지만 당신이 개체로 그것을 사용할 수 있다는 것을 나에게 보인다
Chetter Hummin

Spring JDBCTemplate을 사용해 보셨습니까?
BlackJoker 2013-04-11

답변:


133

@Query 주석을 사용하면 nativeQuery 플래그를 true로 설정하여 네이티브 쿼리를 실행할 수 있습니다.

SpringData JPA 참조 문서 에서 인용 .

또한 명명 된 네이티브 쿼리로 수행하는 방법에 대한 이 섹션 을 참조하십시오 .


13
: 그것은 그래서 @ user454322, 매개 변수는 1로 시작@Query(value = "SELECT * FROM USERS WHERE EMAIL_ADDRESS = ?1", nativeQuery = true)
야곱 반 Lingen의

nativeQuery = true IllegalArgumentException
Reza

45

예, 다음 방법으로이 작업을 수행 할 수 있습니다.

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.

더 많은 정보는이 방문 스레드이 스레드를

감사 :)


3

사용하는 것도 가능합니다 스프링 데이터 JDBC 저장소 JPA를 사용하지 않고, 원시 SQL과 데이터베이스에 대한 액세스에 봄 데이터 가공의 상단에 내장 커뮤니티 프로젝트입니다.

SpringData JPA보다 덜 강력하지만 Hibernate와 같은 ORM을 사용하지 않고 간단한 프로젝트를위한 경량 솔루션을 원한다면 시도해 볼 가치가있는 솔루션입니다.


3

createNativeQuery ( "Here Nagitive SQL Query");를 사용할 수 있습니다.

예 :

Query q = em.createNativeQuery("SELECT a.firstname, a.lastname FROM Author a");
List<Object[]> authors = q.getResultList();

9
em변수 를 만드는 방법도 보여 주면 유용 / 완전 할 것 입니다.
ETL

1

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);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.