我从Spring Boot(Data)3.1.5升级到3.2.0.

我在存储库中的几个查询现在在验证阶段的应用程序启动时抛出异常:

Caused by: Cannot compare left expression of type 'java.lang.Object' with right expression of type 'java.lang.Long'.

例如:

        @Query(value = "SELECT new com.my.service.crud.ReferencedObject(p.id, p.name, r.name) FROM MyEntityA p join MyEntityB r on (p.aId = r.id) WHERE " +
                       " p.aId = :projectId and exists (select id from EntityC where cId = p.id and dTypeId = :uutId)")
        List<ReferencedObject> findReferencesToUtilType(@Param("projectId") Long projectId, @Param("uutId") Long utilTypeId);

这个(匿名的)代码在3.1.5中工作得很好,并返回一个ReferencedObject列表. 我甚至在返回Optional<Entity>findByIdAndOtherAttr(...)的查找器上遇到错误.

根本原因是

Caused by: org.hibernate.query.SemanticException: Cannot compare left expression of type 'java.lang.Long' with right expression of type 'java.lang.Object'

at org.hibernate.query.sqm.internal.TypecheckUtil.assertComparable(TypecheckUtil.java:338)
at org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate.<init>(SqmComparisonPredicate.java:48)
at org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate.<init>(SqmComparisonPredicate.java:34)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.createComparisonPredicate(SemanticQueryBuilder.java:2447)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitComparisonPredicate(SemanticQueryBuilder.java:2391)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitComparisonPredicate(SemanticQueryBuilder.java:268)
at org.hibernate.grammars.hql.HqlParser$ComparisonPredicateContext.accept(HqlParser.java:6071)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGroupedPredicate(SemanticQueryBuilder.java:2251)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitGroupedPredicate(SemanticQueryBuilder.java:268)
at org.hibernate.grammars.hql.HqlParser$GroupedPredicateContext.accept(HqlParser.java:5994)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.consumeJoin(SemanticQueryBuilder.java:2129)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitEntityWithJoins(SemanticQueryBuilder.java:1921)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitFromClause(SemanticQueryBuilder.java:1900)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuery(SemanticQueryBuilder.java:1147)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuerySpecExpression(SemanticQueryBuilder.java:940)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitQuerySpecExpression(SemanticQueryBuilder.java:268)
at org.hibernate.grammars.hql.HqlParser$QuerySpecExpressionContext.accept(HqlParser.java:1844)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSimpleQueryGroup(SemanticQueryBuilder.java:925)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSimpleQueryGroup(SemanticQueryBuilder.java:268)
at org.hibernate.grammars.hql.HqlParser$SimpleQueryGroupContext.accept(HqlParser.java:1718)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitSelectStatement(SemanticQueryBuilder.java:442)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.visitStatement(SemanticQueryBuilder.java:401)
at org.hibernate.query.hql.internal.SemanticQueryBuilder.buildSemanticModel(SemanticQueryBuilder.java:310)
at org.hibernate.query.hql.internal.StandardHqlTranslator.translate(StandardHqlTranslator.java:71)
at org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.createHqlInterpretation(QueryInterpretationCacheStandardImpl.java:165)
at org.hibernate.query.internal.QueryInterpretationCacheStandardImpl.resolveHqlInterpretation(QueryInterpretationCacheStandardImpl.java:147)
at org.hibernate.internal.AbstractSharedSessionContract.interpretHql(AbstractSharedSessionContract.java:744)
at org.hibernate.internal.AbstractSharedSessionContract.createQuery(AbstractSharedSessionContract.java:794)
... 43 common frames omitted

我找到了这个https://discourse.hibernate.org/t/upgrade-to-6-3-rc1-cannot-compare-left-expression-of-type-java-sql-timestamp-with-right-expression-of-type-com-model-entity-impl-user/8034/5 冬眠团队的成员说,这是在比较苹果和橙子.

有没有人有迁移指南的链接?

我必须做什么才能让我的查询再次工作?

在Spring Boot 3.2.0的发行说明中,我只发现了一条提示:"不推荐使用的特性现在已经被取消发布了".

谢谢你的任何提示!

推荐答案

我们发现了问题所在. 我们为所有实体使用一个抽象超类.在这个类中,我们使用ID类的泛型(其中Entity是具有T getId();方法的接口:

public abstract class AbstractEntity<T> implements Entity<T> {
@Id
private T id;

这在Spring Boot Data 3.1.5之前一直有效.

从3.2.0开始,T类不能是泛型类型.为了工作,因为我们所有的身份证都用Long...:

public abstract class AbstractEntity<T extends Long> implements Entity<T> {
@Id
private T id;

引入泛型时考虑了复合ID类.

我们将更改代码并直接使用Long,因为我们在此项目中从未使用复合ID.

仅此而已.不是spring boot / spring data jpa bug之类的.

希望这能帮助别人.

Java相关问答推荐

我可以从Java模块中排除maven资源文件夹吗?

如何审查Java dtos中的自定义注释字段?

当我已经安装了其他版本的Java时,如何在Mac OSX 14.3.1上安装Java 6?

为什么在maven中,getLast方法不适用于List?

无法在Java中处理PayPal支付响应

格式中的特定回录键-值对

从ActiveMQ Classic迁移到ActiveMQ Artemis需要进行哪些客户端更改?

如何在Jooq中获取临时表列引用?

如果第一位数字和最后一位数字相差超过一位,您将如何获得随机数?

在Oracle db中,当我们提供字符串而不是数字时,比较是如何工作的?

如何在SWT菜单项文本中保留@字符

Java Flux中的延迟增加

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

Java类型推断:为什么要编译它?

无限递归Java问题

Java 21内置http客户端固定运营商线程

如何在特定关键字后提取与模式匹配的多个值?

如何使JOOQ渐变脚本不重新创建表未更改的类?

放置在变量中的Java成员引用不相等

在JPanel上使用GridBagLayout并将JButton放在里面时出现问题