Spring Data JPA и Projection получают исключение ConverterNotFoundException для TupleConverter - PullRequest
0 голосов
/ 07 мая 2018

Есть ли способ написать и зарегистрировать конвертер TupleConverter в Spring Data? Я получаю это исключение, когда у меня есть аннотация @Query в интерфейсе репозитория и я запрашиваю проекцию.

Интерфейс:

public interface ProjectRepository extends JpaRepository<Project, Integer> {
    @Query("select p.projectId, p.projectName, p.techstack from Project p")
    public List<ProjectItem> findAllForTest();
}

DTO:

public class ProjectItem {
    private final Integer projectId;
    private final String projectName;
    private final String techstack;
    @JsonCreator
    public ProjectItem(
        @JsonProperty("projectId") Integer projectId, 
        @JsonProperty("projectName") String projectName, 
        @JsonProperty("techstack") String techstack
    ) {
        this.projectId = projectId;
        this.projectName = projectName;
        this.techstack = techstack;
    }
    public Integer getProjectId() {
        return projectId;
    }
    public String getProjectName() {
        return projectName;
    }
    public String getTechstack() {
        return techstack;
    }
}

Исключение

Не найден конвертер, способный преобразовать тип [org.springframework.data.jpa.repository.query.AbstractJpaQuery $ TupleConverter $ TupleBackedMap] в тип [project.item.ProjectItem]] с коренной причиной

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Использовать выражение JPQL для конструктора :

@Query("select new com.company.path.to.ProjectItem(p.projectId, p.projectName, p.techstack) from Project p")
0 голосов
/ 07 мая 2018

Ты рядом. Если вы просто хотите получить DTO с несколькими элементами из исходного элемента, просто используйте технику проекции интерфейса с методами, имеющими те же сигнатуры, что и элементы метода класса Project, которые вы хотите:

public interface ProjectTestSummary {
    public Integer getProjectId();
    public String getProjectName();
    public String getTechstack();
}

А в вашем DAO:

public interface ProjectRepository extends JpaRepository<Project, Integer> {
    public List<ProjectTestSummary> findAllProjectedBy();
}
...