【发布时间】:2021-02-27 23:56:36
【问题描述】:
List<Object> outputList = session.createQuery(
"select usr from User usr where size(usr.user_messages) > 2 "
).list();
当我运行上述查询时,我得到以下异常。使用的数据库是 Postgres。如何在 HQL 中使用 size?
@OneToMany(mappedBy = "user", cascade = CascadeType.PERSIST)
private Set<UserMessages> user_messages = new HashSet<UserMessages>();
Exception in thread "main" java.lang.ClassCastException: org.hibernate.query.sqm.tree.expression.SqmCollectionSize cannot be cast to org.hibernate.sql.ast.tree.expression.Expression
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitComparisonPredicate(BaseSqmToSqlAstConverter.java:2271)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitComparisonPredicate(BaseSqmToSqlAstConverter.java:205)
at org.hibernate.query.sqm.tree.predicate.SqmComparisonPredicate.accept(SqmComparisonPredicate.java:67)
at org.hibernate.query.sqm.sql.BaseSqmToSqlAstConverter.visitQuerySpec(BaseSqmToSqlAstConverter.java:423)
at org.hibernate.query.sqm.sql.internal.StandardSqmSelectTranslator.visitSelectStatement(StandardSqmSelectTranslator.java:185)
at org.hibernate.query.sqm.sql.internal.StandardSqmSelectTranslator.translate(StandardSqmSelectTranslator.java:127)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.buildCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:226)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.resolveCacheableSqmInterpretation(ConcreteSqmSelectQueryPlan.java:193)
at org.hibernate.query.sqm.internal.ConcreteSqmSelectQueryPlan.performList(ConcreteSqmSelectQueryPlan.java:153)
at org.hibernate.query.sqm.internal.QuerySqmImpl.doList(QuerySqmImpl.java:437)
at org.hibernate.query.spi.AbstractQuery.list(AbstractQuery.java:1356)
at com.learning.hibernate.HibernateMain.main(HibernateMain.java:103)
【问题讨论】:
-
stackoverflow.com/questions/3760711/…希望这个链接可以帮助你解决这个问题。
-
@tin_tin 你用什么hibernate方言?
-
org.hibernate.dialect.PostgreSQLDialect -
你用的是什么休眠版本?
-
@SternK 你说得对,我使用的是 Hibernate 5,但在 Hibernate 4 中它工作正常.. 你能说出为什么在更高版本中取消了对大小的支持