Java 我在JPA查询过程中遇到转换类型错误,高效转换的最佳方式是什么?

Java 我在JPA查询过程中遇到转换类型错误,高效转换的最佳方式是什么?,java,sql,spring,jpa,Java,Sql,Spring,Jpa,我收到以下错误: "No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [de.hiqs.project.DTO.ProjectWithoutEmployeeDTO]" 导致错误的查询: @Query("SELECT project.id,

我收到以下错误:

"No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [de.hiqs.project.DTO.ProjectWithoutEmployeeDTO]"
导致错误的查询:

@Query("SELECT project.id, project.name, project.budget, " +
          "project.description, project.isArchived, project.archivedDate, " +
          "project.creationDate, project.customer.name AS customerName " +
          "FROM  Project project")
  List<ProjectWithoutEmployeeDTO> findAllWithoutEmployee();
因此,他似乎无法将查询结果转换为没有EmployeedTo的项目。我认为它会自动运行,因为该类与查询结果具有完全相同的命名属性,但它似乎没有。高效转换结果的最佳方法是什么?我可以返回一个对象列表,而不是一个没有员工需要的项目列表,并在服务内部手动转换,但这似乎不是最好的方法

编辑: 我设法做到了

@Query("SELECT new classpath.ProjectWithoutEmployeeDTO(project.id, project.name, project.budget, " +
          "project.description, project.isArchived, project.archivedDate, " +
          "project.creationDate, project.customer.name) " +
          "FROM  Project project")
  List<ProjectWithoutEmployeeDTO> findAllWithoutEmployee();

然后只需将该构造函数添加到DTO中,或者让Lambok使用@allargsconstuctor自动执行该操作

您的查询应使用构造函数表达式:

@Query("SELECT NEW yourpackage.ProjectWithoutEmployeeDTO(project.id, project.name, project.budget, " +
       "project.description, project.isArchived, project.archivedDate, " +
       "project.creationDate, project.customer.name AS customerName) " +
       "FROM  Project project")
请注意,ProjectWithoutEmployeeDTO必须是完全限定的

javax.persistence.Converter
@Query("SELECT new classpath.ProjectWithoutEmployeeDTO(project.id, project.name, project.budget, " +
          "project.description, project.isArchived, project.archivedDate, " +
          "project.creationDate, project.customer.name) " +
          "FROM  Project project")
  List<ProjectWithoutEmployeeDTO> findAllWithoutEmployee();
@Query("SELECT NEW yourpackage.ProjectWithoutEmployeeDTO(project.id, project.name, project.budget, " +
       "project.description, project.isArchived, project.archivedDate, " +
       "project.creationDate, project.customer.name AS customerName) " +
       "FROM  Project project")