我正在获取以下堆栈跟踪:
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [referencedata.ABDeadlineType] to type [referencedata.DeadlineType]
at org.springframework.core.convert.support.GenericConversionService.handleConverterNotFound(GenericConversionService.java:324)
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:206)
at org.springframework.core.convert.support.GenericConversionService.convert(GenericConversionService.java:187)
at org.springframework.data.repository.query.ResultProcessor$ProjectingConverter.convert(ResultProcessor.java:256)
at org.springframework.data.repository.query.ResultProcessor$ChainingConverter$1.convert(ResultProcessor.java:201)
at org.springframework.data.repository.query.ResultProcessor$ChainingConverter.convert(ResultProcessor.java:212)
at org.springframework.data.repository.query.ResultProcessor.processResult(ResultProcessor.java:149)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:121)
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:106)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.doInvoke(RepositoryFactorySupport.java:483)
at org.springframework.data.repository.core.support.RepositoryFactorySupport$QueryExecutorMethodInterceptor.invoke(RepositoryFactorySupport.java:461)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:56)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:136)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:133)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:57)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy143.findAllSummarizedBy(Unknown Source)
at
我的课程如下
截止日期类型
@Data
public class DeadlineType extends DefaultIdAndText {
@Value("#{target.id}")
String id;
@Value("#{target.code}")
String text;
@Value("#{target.id}")
public String getId() {
return id;
}
@Value("#{target.code}")
public String getText() {
return text;
}
}
AB截止日期类型
@Data
@Entity
@Table(name = "deadline_type")
@AllArgsConstructor
@NoArgsConstructor
public class ABDeadlineType {
private @Id
String id;
private String code;
}
默认标识和文本
@Data @AllArgsConstructor
@NoArgsConstructor
public class DefaultIdAndText implements IdAndText {
public DefaultIdAndText(IdAndText idAndText){
this.id = idAndText.getId();
this.text = idAndText.getText();
}
@NotEmpty String id;
String text;
}
截止日期类型存储库
public interface DeadlineTypeRepository extends JpaRepository<ABDeadlineType, Long> {
List<DeadlineType> findAllSummarizedBy();
}
更新
是否存在使用@Value("#{target.id}")
的投影/Map无法正常工作的问题,因为这些工作是在类上完成的,而不是在接口上???
7条答案
按热度按时间o2gm4chl1#
从存储库返回
ABDeadlineType
:然后转换为DeadlineType。请手动或使用mapstruct。
或者从
@Query
注解中调用构造函数:或者使用
@Projection
:**更新:**Spring可以在没有
@Projection
注解的情况下工作:fnvucqvd2#
你可能已经有这个工作,但我创建了一个测试项目与类下面允许您检索数据到一个实体,投影或dto。
Projection-这将返回code列两次,一次命名为code,另一次命名为text(仅作为示例)。
DTO类-不确定为什么要从基类继承,然后重新定义属性。JsonProperty只是一个示例,说明如何更改传递回REST端点的字段的名称
实体类
存储库-您的存储库扩展了JpaRepository〈ABDeadlineType,Long〉,但ID是字符串,因此在下面更新为JpaRepository〈ABDeadlineType,String〉
示例控制器-直接访问存储库以简化代码
希望能有所帮助
莱斯
k4ymrczo3#
我最近在spring-data-jpa:2.5.0中遇到了同样的问题。
解决方案(适用于没有@Query注解的查询):
对于基于类的投影(DTO),问题是DTO类中的
@NoArgsConstructor
。删除它应该可以使事情正常工作。在调试期间发现了一些有趣的东西:
由于存在非参数构造函数,因此
returnedType
不知何故被创建为具有0个输入属性。当一个查询被实际创建时,
JpaQueryCreator
(spring-data-jpa)将根据输入属性的数量检查它是否需要进行自定义构造。因为它不是0输入属性的情况,所以它将返回整个实体示例。
https://github.com/spring-projects/spring-data-jpa/blob/main/src/main/java/org/springframework/data/jpa/repository/query/JpaQueryCreator.java#L169
最后,当返回结果时,目标类型和返回的类型不匹配,因为没有转换器可用于从实体示例转换为投影数据。引发错误。
https://github.com/spring-projects/spring-data-commons/blob/main/src/main/java/org/springframework/data/repository/query/ResultProcessor.java#L162
vsmadaxz4#
如果你看一下异常堆栈跟踪,它说,它从
ABDeadlineType
转换到DeadlineType
失败。因为你的仓库将返回ABDeadlineType
的对象。spring-data-jpa
如何转换成另一个(DeadlineType
)。你应该从仓库返回相同的类型,然后有一些中间的util类将它转换成你的模型类。ykejflvf5#
事实证明,当表名与模型名不同时,必须将注解更改为:
而不是简单地使用@Entity注解。
对我来说奇怪的是,它试图转换成的类不存在。这对我来说很有效。
3b6akqbq6#
简单的解决方案::
请在查询中使用{nativeQuery=true}。
例如
zsbz8rwp7#
我有另一个答案,我使用了投影的接口和Dto的类,我使用ModelMapper将投影Map到Dto类,因此我的1 Dto类可能有许多投影,这些投影可以Map到Dto并用于Taste
gradle实现'组织模型Map器:模型Map器:3.1.0'
我的投影是这样的
我的dto是
而且我能够从自定义查询中获取字段