복붙노트

[SPRING] Projection을 사용한 Spring JPA 네이티브 쿼리는 "ConverterNotFoundException"

SPRING

Projection을 사용한 Spring JPA 네이티브 쿼리는 "ConverterNotFoundException"

Spring JPA를 사용하고 있으며 네이티브 쿼리가 필요합니다. 이 쿼리를 사용하면 테이블에서 두 개의 필드 만 가져와야하므로 Projections를 사용하려고합니다. 그것은 작동하지 않습니다, 이것은 내가 받고있는 오류입니다 :

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [com.example.IdsOnly]

나는 링크 된 페이지의 지시를 정확히 따르려고했는데, 내 쿼리를 비 원어로 만들려고 노력했다. (실제로 투영법을 사용하면 네이티브 일 필요가 있는가?) 그러나 나는 항상 그 오류를 얻는다. 인터페이스를 사용하면 작동하지만 결과는 프록시이므로 json으로 바꿀 수있는 "정상적인 결과"가 필요합니다.

여기 제 코드가 있습니다. 엔티티 :

import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@NoArgsConstructor
@Entity
@Table(name = "TestTable")
public class TestTable {

    @Id
    @Basic(optional = false)
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "Id")
    private Integer id;
    @Column(name = "OtherId")
    private String otherId;
    @Column(name = "CreationDate")
    @Temporal(TemporalType.TIMESTAMP)
    private Date creationDate;
    @Column(name = "Type")
    private Integer type;
}

투영 클래스 :

import lombok.Value;

@Value // This annotation fills in the "hashCode" and "equals" methods, plus the all-arguments constructor
public class IdsOnly {

    private final Integer id;
    private final String otherId;
}

저장소 :

public interface TestTableRepository extends JpaRepository<TestTable, Integer> {

    @Query(value = "select Id, OtherId from TestTable where CreationDate > ?1 and Type in (?2)", nativeQuery = true)
    public Collection<IdsOnly> findEntriesAfterDate(Date creationDate, List<Integer> types);
}

그리고 데이터를 얻으려고하는 코드는 다음과 같습니다.

@Autowired
TestTableRepository ttRepo;
...
    Date theDate = ...
    List<Integer> theListOfTypes = ...
    ...
    Collection<IdsOnly> results = ttRepo.findEntriesAfterDate(theDate, theListOfTypes);  

도와 주셔서 감사합니다. 나는 내가 뭘 잘못하고 있는지 이해하지 못한다.

해결법

  1. ==============================

    1.쿼리는 생성자 표현식을 사용해야합니다.

    쿼리는 생성자 표현식을 사용해야합니다.

    @Query("select new com.example.IdsOnly(t.id, t.otherId) from TestTable t where t.creationDate > ?1 and t.type in (?2)")
    

    그리고 저는 롬복을 모르지만 두 ID를 매개 변수로 사용하는 생성자가 있는지 확인하십시오.

  2. ==============================

    2.봄 데이터를 사용하면 중간 사람을 잘라 간단하게 사용할 수 있습니다.

    봄 데이터를 사용하면 중간 사람을 잘라 간단하게 사용할 수 있습니다.

    public interface IdsOnly {
      Integer getId();
      String getOtherId();
    }
    

    다음과 같은 원시 쿼리를 사용하십시오.

    @Query(value = "Id, OtherId from TestTable where CreationDate > ?1 and Type in (?2)", nativeQuery = true)
        public Collection<IdsOnly> findEntriesAfterDate(Date creationDate, List<Integer> types);
    

    https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#projections를 확인하십시오.

  3. ==============================

    3.JPA 2.1은 고유하게 유지하려는 경우 흥미로운 ConstructorResult 기능을 도입했습니다.

    JPA 2.1은 고유하게 유지하려는 경우 흥미로운 ConstructorResult 기능을 도입했습니다.

  4. from https://stackoverflow.com/questions/49500309/spring-jpa-native-query-with-projection-gives-converternotfoundexception by cc-by-sa and MIT license