2017-04-10 1 views
0

나는이처럼 보이는 쿼리 주석 스프링 JPA의 REPO 있습니다. 요청한 필드 유형에 해당하는 Object [] 목록을 반환합니다.봄 JPA 반환 필드 만이 아니라 실체는

무슨 일 이니? 이 같은

+2

당신은 MainEntity의 e'에서'선택 전자를 시도? –

+0

나는 그것에 대해 궁금해했다. 나는'select * ...'와'select e. *'를 시도했지만 실패했다. – NickJ

+1

'SELECT e FROM MainEntity e'는 전체 엔터티를 반환합니다. 일련의 필드가 필요하면 내 [answer] (http://stackoverflow.com/a/43331990/1426227)을 확인하십시오. –

답변

6

는 JPA 엔티티 (또는 여러 기관)에서, 즉, 필드의 세트를 Object[]의 목록을 반환합니다.

스프링 데이터 JPA 사용하면 Object[]을 피할 수 있으며, 다음과 같이 인터페이스를 정의하여 더 우아한 형식에 데이터를 반환 :

public interface MainEntityProjection { 
    String getStart(); 
    String getFinish(); 
    String getForename(); 
    String getSurname(); 
} 

그리고 위의 정의 된 인터페이스를 반환하는 쿼리 방법을 변경 :

@Query("SELECT e.start, e.finish, e.forename, e.surname " + 
     "FROM MainEntity e " + 
     "WHERE e.volunteerId = :id AND e.areaId > 0 AND e.isAssignment = true " + 
     "ORDER BY e.start") 
List<MainEntityProjection> findAssignments(@Param("id") int volunteerId); 

이 접근법은 Spring Data JPA documentation에 설명되어 있습니다.


는 별도로 스프링 데이터 JPA에서 JPA 자체는 public 생성자를 사용하여, SELECT NEW으로 처리합니다. 당신은 다음과 같은 클래스를 정의합니다 :

public class MainEntityProjection { 

    private String start; 
    private String finish; 
    private String forename; 
    private String surname; 

    public MainEntityProjection(String start, String finish, 
           String forename, String surname) { 
     this.start = start; 
     this.finish = finish; 
     this.forename = forename; 
     this.surname = surname; 
    } 

    // Getters and setters 
} 

을 그리고 같은 다음 쿼리는 다음과 같습니다

는 위의 쿼리는 또한 스프링 데이터 JPA와 함께 작동 할 것으로 예상된다
SELECT NEW org.example.MainEntityProjection(e.start, e.finish, e.forename, e.surname) 
FROM MainEntity e 
WHERE e.volunteerId = :id AND e.areaId > 0 AND e.isAssignment = true 
ORDER BY e.start 

이 (당신의 방법의 목록을 반환합니다 MainEntityProjection).

가 는

SELECT 절

에서 4.8.2 생성자 표현이 생성자를 사용할 수있다 다음 JSR 338는 JPA 2.1을 정의하는 문서, SELECT NEW 및 생성자 표현을 사용하는 방법에 대해 말씀

확인 SELECT 목록에서 Java 클래스의 인스턴스를 리턴하십시오. 지정된 클래스는 엔티티이거나 데이터베이스에 맵핑 될 필요가 없습니다. 생성자 이름은 정규화 된 이름이어야합니다.

SELECT NEW 절에 생성자 이름으로 엔터티 클래스 이름이 지정되면 결과 개체 인스턴스는 생성 된 개체에 대한 기본 키가 검색되는지 여부에 따라 새 상태 또는 분리 된 상태가됩니다.

만약 single_valued_path_expression 또는 생성자 인수 엔티티를 참조하여 얻어진 참조 엔티티 인스턴스 identification_variablesingle_valued_path_expression 또는 identification_variable 관리 상태에있을 것이다. 예를 들어

SELECT NEW com.acme.example.CustomerDetails(c.id, c.status, o.count) 
FROM Customer c JOIN c.orders o 
WHERE o.count > 100 
0

쓰기 :

@Query("from MainEntity e where e.volunteerId= :id " 
     + "and e.areaId>0 and e.isAssignment=true order by e.start") 
+0

당신은 JPQL –

+0

에서 "SELECT e"를 놓친 것처럼 보입니다. "select e"없이도 사용할 수 있습니다. – coenni

+0

당신이 JPA 스펙을 준수한다면 오류가 없습니다. –

0

당신은 개체 만의 필드를 요청하지 않습니다. 반면에 객체 배열이 리턴되었습니다. 시도해보십시오. 조회가 프로젝션와 목록을 반환 할 때 정의에

 Select e from MainEntity e ...