I'm having a problem with entitymanager and LEFT JOIN FETCH Queries.
Hibernate throws a NullPointerException when calling Persistence.createEntityManagerFactory("fooPU"); (i use a named query, so exception occours when Hibernate is parsing this query).
Have anyone meet with such an error.
Hibernate version:
entitymanager 3.2.2.ga with dependencies fetched by maven
Mapping documents:
Code:
@NamedQueries({
@NamedQuery(name = "foo",
query= "SELECT f FROM FooEntity f LEFT JOIN FETCH f.baz WHERE f.id = :id")
})
@Entity
public class FooEntity {
@Id
Long id;
@Basic(fetch = FetchType.LAZY)
String baz;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getBaz() {
return baz;
}
public void setBaz(String baz) {
this.baz = baz;
}
}
If I change foo query to:
Code:
SELECT f FROM FooEntity f FETCH ALL PROPERTIES WHERE f.id = :id
everything works OK
Full stack trace of any exception that occurs:Code:
Exception in thread "main" java.lang.NullPointerException
at org.hibernate.hql.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:310)
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.SessionFactoryImpl.checkNamedQueries(SessionFactoryImpl.java:402)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:352)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1300)
at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:52)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:34)
at snippet.test.main(test.java:18)
Debug level Hibernate log excerpt:
I think thats the applicable part
DEBUG - Checking 1 named HQL queries
DEBUG - Checking named query: foo
DEBUG - unable to locate HQL query plan in cache; generating (SELECT f FROM FooEntity f LEFT JOIN FETCH f.baz WHERE f.id = :id)
DEBUG - parse() - HQL: SELECT f FROM snippet.FooEntity f LEFT JOIN FETCH f.baz WHERE f.id = :id
DEBUG - --- HQL AST ---
\-[QUERY] 'query'
+-[SELECT_FROM] 'SELECT_FROM'
| +-[FROM] 'FROM'
| | +-[RANGE] 'RANGE'
| | | +-[DOT] '.'
| | | | +-[IDENT] 'snippet'
| | | | \-[IDENT] 'FooEntity'
| | | \-[ALIAS] 'f'
| | \-[JOIN] 'JOIN'
| | +-[LEFT] 'LEFT'
| | +-[FETCH] 'FETCH'
| | \-[DOT] '.'
| | +-[IDENT] 'f'
| | \-[IDENT] 'baz'
| \-[SELECT] 'SELECT'
| \-[IDENT] 'f'
\-[WHERE] 'WHERE'
\-[EQ] '='
+-[DOT] '.'
| +-[IDENT] 'f'
| \-[IDENT] 'id'
\-[COLON] ':'
\-[IDENT] 'id'
DEBUG - throwQueryException() : no errors
DEBUG - select << begin [level=1, statement=select]
DEBUG - FromClause{level=1} : snippet.FooEntity (f) -> fooentity0_
DEBUG - Resolved : f -> fooentity0_.id
DEBUG - handling property dereference [snippet.FooEntity (f) -> baz (class)]
DEBUG - getDataType() : baz -> org.hibernate.type.StringType@e5355f
DEBUG - Resolved : f.baz -> fooentity0_.baz