我有一个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
?还是有更好的解决方案?
答案 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(...))