2010-05-17 70 views
4

我有没有遇到休眠错误或做我有一个错误我没有看到:这个HQL查询有什么问题?

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) 

:休眠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。指着我在正确的方向

感谢mdma:从identityId更改属性名解决的问题。

+0

你用1或2个绑定参数调用它吗?它看起来像它想要2,但我不是一个休眠大师。 – MJB 2010-05-17 13:42:00

+0

即使没有执行,在部署时,hibernate会从XML文件中分析静态定义的HQL,从而出现错误。 – ManBugra 2010-05-17 13:43:35

+0

它们被命名为参数,所以我相信你只需要一个参数,因为它们都具有相同的名称。但可以肯定的是,您可以从查询和硬编码值中删除参数,仅用于测试。 – mdma 2010-05-17 13:48:10

回答

3

我找到了解决方案。我的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。指着我在正确的方向

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

感谢mdma:从identityId更改属性名解决的问题。

刚才复制的答案从我的更新上面,关闭它作为回答,并保持接受比高达

0

我得到空创建我的EntityManager像1-2个小时,不知道为什么,和这个职位只是解决了我问题。

我曾在一个类(JAVA):

@GeneratedValue 
private Long id; 
public Long getId() { 
    return id; 
} 

我刚才读您的文章,并把它改为:

@JoinColumn(name = "id") 
    @GeneratedValue 
    private Long ide; 
    public Long getId() { 
     return ide; 
    } 

最后编好。