2012-04-04 9 views
3

Ich habe eine Webanwendung, die eine Suchmaske hat und HQL wird im laufenden Betrieb generiert. Benutzer können auch auf die Spaltenüberschriften klicken, um Artikel nach Bedarf zu sortieren. Einige Spalten erhalten Daten von sehr tief in der Struktur.Hibernate wirft NullPointerException von HqlSqlWalker

Ich habe diese HQL, zum Beispiel, die einwandfrei funktioniert:

SELECT s FROM Application s 
    LEFT JOIN s.product AS product 
    LEFT JOIN product.originCountry AS origin 
WHERE s.nr = ? ORDER BY origin.name ASC 

Aber dies scheitert kläglich:

SELECT s FROM Application s 
    LEFT JOIN s.product AS product 
    LEFT JOIN product.producer AS producer 
    LEFT JOIN producer.address AS address 
    LEFT JOIN address.country AS country 
WHERE s.nr = ? ORDER BY country.name ASC 

Kann jemand darauf hin, wohin gehe ich falsch. Wird eine solche tiefe Syntax nicht unterstützt oder so?

Hibernate-Version ist 3.2.1.

Sorry, vergaß die Stacktrace:

2012-04-04 18:59:42,198 ERROR [foo.impl.ServiceImpl] java.lang.NullPointerException 
java.lang.NullPointerException 
at org.hibernate.hql.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:312) 
at org.hibernate.hql.antlr.HqlSqlBaseWalker.joinElement(HqlSqlBaseWalker.java:3275) 
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElement(HqlSqlBaseWalker.java:3067) 
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromElementList(HqlSqlBaseWalker.java:2945) 
at org.hibernate.hql.antlr.HqlSqlBaseWalker.fromClause(HqlSqlBaseWalker.java:688) 
at org.hibernate.hql.antlr.HqlSqlBaseWalker.query(HqlSqlBaseWalker.java:544) 
at org.hibernate.hql.antlr.HqlSqlBaseWalker.selectStatement(HqlSqlBaseWalker.java:281) 
at org.hibernate.hql.antlr.HqlSqlBaseWalker.statement(HqlSqlBaseWalker.java:229) 
at org.hibernate.hql.ast.QueryTranslatorImpl.analyze(QueryTranslatorImpl.java:228) 
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:160) 
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:111) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:77) 
at org.hibernate.engine.query.HQLQueryPlan.<init>(HQLQueryPlan.java:56) 
at org.hibernate.engine.query.QueryPlanCache.getHQLQueryPlan(QueryPlanCache.java:72) 
at org.hibernate.impl.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:133) 
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:112) 
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1623) 
at sun.reflect.GeneratedMethodAccessor336.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
at java.lang.reflect.Method.invoke(Method.java:585) 
at org.springframework.orm.hibernate3.HibernateTemplate$CloseSuppressingInvocationHandler.invoke(HibernateTemplate.java:1192) 
at $Proxy90.createQuery(Unknown Source) 
..... 
+0

können Sie den genauen Stack-Trace und Hibernate Version veröffentlichen? –

+0

Sorry, ich habe es vergessen. Habe jetzt. – Raidok

+2

Könnten Sie die Entitäten veröffentlichen? Sind alle diese Klassen entities (und nicht eingebettete Objekte). Auch 3.2.1 ist sehr alt. Warum wechseln Sie nicht zu einer neueren Version? –

Antwort

6

Wie @JBNizet richtig darauf hingewiesen, das Problem war, dass eine der Klassen (mit dem Namen address genau zu sein) auf dem Weg keine Einheit war, war es eine einbettbares Objekt und muss daher nicht verbunden werden.

So die zweite Abfrage richtig in meinem Fall geschrieben sei:

SELECT s FROM Application s 
    LEFT JOIN s.product AS product 
    LEFT JOIN product.producer AS producer 
    LEFT JOIN producer.address.country AS country 
WHERE s.nr = ? ORDER BY country.name ASC 
Verwandte Themen