错误'使用@Query(“ Select * from”)时找不到找不到能够从XXX类型转换的转换器'

时间:2019-02-18 22:07:25

标签: java hibernate rest spring-boot jpa

我有一个DocumentData班:

@Data //Lombok
public class DocumentData {

    private Long documentId;
    private Long binderId;
    private String containerCode;
    private String barcode;
    private Long clientId;

}

我有我的存储库:

public interface DocumentArchiveRepository extends JpaRepository<DocumentArchive, Long> {

    String QUERY_GET_DOCUMENT_DATA = "SELECT DISTINCT d.id_document, pd.id_binder, s.container_code, d.barcode, k.id_client FROM table1 pd \n"
            + "JOIN table2 d ON pd.id_document = d.id_cokument\n"
            + "JOIN table3 s ON s.id = pd.id_binder \n"
            + "JOIN table4 k ON k.id_document = d.id_document\n"
            + "WHERE pd.id_position = 10122 AND d.id_document in :documentIds";

    @Query(value = QUERY_GET_DOCUMENT_DATA, nativeQuery = true)
    List<DocumentData> getDocumentData(@Param("documentIds") List<Long> documentIds);

当我想获取数据时:

List<DocumentData> documentData = repository.getDocumentData(documentIds);

我收到以下错误:

  

org.springframework.core.convert.ConverterNotFoundException:否   发现能够从类型转换的转换器   [org.springframework.data.jpa.repository.query.AbstractJpaQuery $ TupleConverter $ TupleBackedMap]   在以下位置键入[pl.ultimo.retention.archive.dto.DocumentData]   org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:321)   〜[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]在   org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:194)   〜[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]在   org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:174)   〜[spring-core-5.1.4.RELEASE.jar:5.1.4.RELEASE]

是否应该将代码更改为List<Object>,然后将结果每年映射到DocumentData?还是有更好的解决方案?

2 个答案:

答案 0 :(得分:1)

您必须将查询包装在构造函数中

String QUERY_GET_DOCUMENT_DATA = "SELECT new " + DocumentData.class.getName() + "(d.id_document, pd.id_binder, s.container_code, d.barcode, k.id_client) FROM table1 pd "
        + "JOIN table2 d ON pd.id_document = d.id_cokument "
        + "JOIN table3 s ON s.id = pd.id_binder "
        + "JOIN table4 k ON k.id_document = d.id_document "
        + "WHERE pd.id_position = 10122 AND d.id_document in :documentIds";

通知括号。另外,我使用的是DocumentData.class.getName(),但是如果名称"DocumentData"在类路径上是唯一的,则可以使用它。我不确定这是否可以作为本机查询运行,如果不能,请尝试-以jpql运行。

其他解决方案是定义自定义Converter实现,并用@Converter注释问题。

答案 1 :(得分:0)

最后,在没有实体的情况下,我没有为我的案件找到合适的解决方案。我必须创建所有必要的实体,仅包含必需的字段,然后在查询中使用它们的名称(使用Select new MyPOJOClass(...))