2010-05-17 69 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; 
    } 

最後編好。