升级至Spring Boot 3.3.0后Spring Data JPA校验失败
Spring Boot 3.3.0升级后JPA查询构造函数匹配失败
将Spring Boot从3.2.3版本升级至3.3.0版本后,原本正常运行的JPA查询出现了校验错误。
定义的Summary记录
public record Summary( long productionRunId, long productId, String productLengthName, long count, double volume) { }
对应的JPA查询方法
@Query( """ SELECT new com.example.Summary( t.productionRun.id, t.product.id, t.productLengthName, COUNT(*), SUM(t.volume) ) FROM Tag t GROUP BY t.productionRun.id, t.product.id, t.productLengthName """ ) List<Summary> getSummaries();
报错信息
Caused by: org.hibernate.query.SemanticException: Missing constructor for type 'Summary' at app//org.hibernate.query.hql.internal.SemanticQueryBuilder.visitInstantiation(SemanticQueryBuilder.java:1506) at app//org.hibernate.query.hql.internal.SemanticQueryBuilder.visitInstantiation(SemanticQueryBuilder.java:275) at app//org.hibernate.grammars.hql.HqlParser$InstantiationContext.accept(HqlParser.java:4029) at app//org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSelectableNode(SemanticQueryBuilder.java:1453) at app//org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSelection(SemanticQueryBuilder.java:1407)
调试细节
调试发现问题出在SemanticQueryBuilder.visitInstantiationArgument方法中:该方法将Summary.productionRunId的nodeJavaType识别为Void,但实际类型应为long。这导致Hibernate无法找到匹配的构造函数,奇怪的是其余4个构造函数参数的类型识别都是正确的。调试截图显示,第一个参数的类型被错误标记为Void,其余参数类型均匹配正常。
内容的提问来源于stack exchange,提问作者Kevin
相关产品推荐
相关产品推荐

