【问题标题】:Unable to use size function in HQL无法在 HQL 中使用 size 函数
【发布时间】: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 中它工作正常.. 你能说出为什么在更高版本中取消了对大小的支持

标签: hibernate jpa


【解决方案1】:

使用以下依赖大小函数可以正常工作

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.0.0.Final</version>
    </dependency>

但是对于这个依赖大小函数不起作用。不知道为什么取消了支持,但我的问题已经解决了

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>6.0.0.Alpha6</version>
    <type>pom</type>
</dependency>

【讨论】:

    【解决方案2】:

    Hibernate 6.0 现在不稳定。 size expression 在最新的稳定休眠 5.4 版本 (5.4.24.Final) 中完美运行。

    以下hql:

    List<User> users = em.createQuery(
       "select u from User u where size(u.messages) > 1",
       User.class).getResultList();
    

    会生成如下sql:

    select
       user0_.usr_id as usr_id1_1_,
       user0_.usr_name as usr_name2_1_ 
    from TEST_SCHEMA.TST3_USERS user0_ 
    where (
       select count(messages1_.msg_user_id) 
       from TEST_SCHEMA.TST3_MESSAGE messages1_ 
       where user0_.usr_id = messages1_.msg_user_id
    ) > 1
    

    附:我建议您使用 jpa 2.0 类型查询:

    TypedQuery<T> createQuery(String qlString, Class<T> resultClass)
    

    而不是老式的

    Query createQuery(String qlString)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-04
      • 2012-08-18
      • 1970-01-01
      • 2021-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-08
      相关资源
      最近更新 更多