programing

스프링 저장소 내에서 원시 SQL을 사용할 수 있습니까?

newsource 2022. 9. 22. 00:26

스프링 저장소 내에서 원시 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