2010-05-17 5 views
4

ne je rencontre un bug de mise en veille prolongée ou dois-je une erreur je ne vois pas:Quel est le problème avec cette requête 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 
    ) 
    ) 
) 

ce que je reçois est la suivante:

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) 

utilisant: Mise en veille prolongée 3.3.2.GA/postgresql


Mise à jour:

J'ai essayé d'isoler l'erreur en essayant d'exécuter chaque sous-clause pour la sienne. Je compris que je reçois la même exception en tout exécutant:

select enty.number from EntityAliasName enty 

mais si j'exécute ce qui suit il fonctionne:

select number from EntityAliasName enty 

maintenant la question, Pourquoi?

peut-être que je devrais mentionner que EntityAliasName est un alias d'entité définie par:

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

Mise à jour 2:

Je trouve une solution à la question. Mon POJO a été mis en correspondance ainsi:

<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> 

il y a un problème en ayant un identifiant composite et en utilisant une propriété nommée id: HHH-1851 rapporté par Anthony Patricio. Modification du nom de la propriété id-entityId résolu le problème:

Merci à mdma pour moi pointant dans la bonne direction.

+0

On dirait qu'il veut 2, mais je ne suis pas un gourou hibernation. – MJB

+0

une erreur survient même sans exécution, lors du déploiement lorsque hibernate analyse des HQL définis statiques à partir de fichiers XML. – ManBugra

+0

Ils sont nommés paramètres, donc je crois que vous en avez seulement besoin, puisqu'ils ont tous les deux le même nom. Mais pour être sûr, vous pouvez supprimer les paramètres de la requête et les valeurs de code dur, juste pour tester. – mdma

Répondre

3

J'ai trouvé une solution au problème. Mon POJO a été mis en correspondance ainsi:

<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> 

il y a un problème en ayant un identifiant composite et en utilisant une propriété nommée id: HHH-1851 rapporté par Anthony Patricio. Modification du nom de la propriété id-entityId résolu le problème:

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

Merci à mdma pour moi pointant dans la bonne direction.

juste la réponse de copier ma mise à jour ci-dessus, pour le fermer comme une réponse et de garder accepter le rapport en

0

Je recevais la création de null mon entityManager comme 1-2 heures, aucune idée pourquoi, et ce poste vient de résoudre mon problème.

i avait dans une classe (Java):

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

Je viens de lire votre message et changé à:

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

Et enfin une bonne compilation. L'appelez-vous avec 1 ou 2 paramètres de liaison?

Questions connexes