java - 这个 HQL 查询有什么问题?

标签 java hibernate hql

我是遇到了 hibernate 错误还是遇到了我没有看到的错误:

select enty.number from EntityAliasName enty
  where enty.myId in
  (
    select cons.myId from Consens cons where cons.number in
    (
      select ord.number from Orders ord where ord.customer = :customer 
      and ord.creationDate <
      (
        select max(ord.creationDate) from Orders ord where ord.customer = :customer
      )
    )
  )

我得到的是以下内容:

org.hibernate.util.StringHelper.root(StringHelper.java:257)

Caused by: java.lang.NullPointerException
        at org.hibernate.util.StringHelper.root(StringHelper.java:257)
        at org.hibernate.persister.entity.AbstractEntityPersister.getSubclassPropertyTableNumber(AbstractEntityPersister.java:1391)
        at org.hibernate.persister.entity.BasicEntityPropertyMapping.toColumns(BasicEntityPropertyMapping.java:54)
        at org.hibernate.persister.entity.AbstractEntityPersister.toColumns(AbstractEntityPersister.java:1367)
        at org.hibernate.hql.ast.tree.FromElement.getIdentityColumn(FromElement.java:320)
        at org.hibernate.hql.ast.tree.IdentNode.resolveAsAlias(IdentNode.java:154)
        at org.hibernate.hql.ast.tree.IdentNode.resolve(IdentNode.java:100)
        at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:117)
        at org.hibernate.hql.ast.tree.FromReferenceNode.resolve(FromReferenceNode.java:113)
        at org.hibernate.hql.ast.HqlSqlWalker.resolve(HqlSqlWalker.java:854)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.propertyRef(HqlSqlBaseWalker.java:1172)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.propertyRefLhs(HqlSqlBaseWalker.java:5167)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.propertyRef(HqlSqlBaseWalker.java:1133)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExpr(HqlSqlBaseWalker.java:1993)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectExprList(HqlSqlBaseWalker.java:1932)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectClause(HqlSqlBaseWalker.java:1476)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:580)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:288)
        at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:231)
        at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:254)
        at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:185)
        at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:136)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:101)
        at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:80)
        at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:94)
        at org.hibernate.impl.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:484)
        at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:394)
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1341)

使用:Hibernate 3.3.2.GA/postgresql


更新:

我试图通过尝试为自己执行每个子条款来隔离错误。我发现我通过执行得到了同样的异常:

select enty.number from EntityAliasName enty

但是如果我执行以下它会起作用:

select number from EntityAliasName enty

那么现在的问题是,为什么?

也许我应该提到 EntityAliasName 是通过以下方式定义的实体别名:

<class name="package.EntityName"
         table="entities"
        entity-name="EntityAliasName"
        mutable="false"> ... </class>

更新 2:

我找到了解决问题的方法。我的 POJO 是这样映射的:

<class name="package.EntityName"
             table="entities"
            entity-name="EntityAliasName"
            mutable="false">

  <composite-id>
    <key-property name="val1" column="val1" type="long"/>
    <key-property name="val2" column="val2" type="integer"/>
  </composite-id>

  <property name="id" column="entity_id" type="string" length="255" not-null="true"/>

  ...

</class>

在使用复合 ID 和使用名为 id 的属性时出现问题:HHH-1851报告人 Anthony Patricio .将属性名称从 id 更改为 entityId 解决了这个问题:

感谢mdma为我指明了正确的方向。

最佳答案

我找到了解决问题的方法。我的 POJO 是这样映射的:

<class name="package.EntityName"
             table="entities"
            entity-name="EntityAliasName"
            mutable="false">

  <composite-id>
    <key-property name="val1" column="val1" type="long"/>
    <key-property name="val2" column="val2" type="integer"/>
  </composite-id>

  <property name="id" column="entity_id" type="string" length="255" not-null="true"/>

  ...

</class>

在使用复合 ID 和使用名为 id 的属性时出现问题:HHH-1851报告人 Anthony Patricio .将属性名称从 id 更改为 entityId 解决了这个问题:

<property name="entityId" column="entity_id" 
type="string" length="255" not-null="true"/>

感谢mdma为我指明了正确的方向。

刚刚从我上面的更新中复制了答案,作为回答关闭它并保持接受率

关于java - 这个 HQL 查询有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2849447/

相关文章:

java - 如何从微调器中检索选定的值并在另一个类中使用它? - 安卓

java - 当我尝试使用 WHERE 子句时出现异常

java - 如何在 GUI 中反射(reflect)长时间运行的工作流程?

java - 在多个查询中重用 esper 中的流

java - 无法在 IntelliJ IDEA 中导入 javax.validation.constraints

java - 我是否需要重写 jpa 实体的 IdClass (组合键)中的 equals() 和 hashCode()

java - 在 Hibernate 架构更新发生时执行我自己的脚本

java - 数据类型 datetime 和 time 在大于或等于运算符中不兼容

java - HQL 子查询中的 NPE

java - Java 中 HTTP 响应的返回值