Hibernate从HqlSqlWalker引发NullPointerException [英] Hibernate throws NullPointerException from HqlSqlWalker
问题描述
我有一个Web应用程序,该应用程序具有搜索表单,并且可以即时生成HQL.此外,用户可以单击列标题以根据需要对项目进行排序.有些列从非常深的结构中获取更多数据.
I have a web application, which has a search form and HQL is generated on the fly. Also, user can click on the column headers to sort items as needed. Some columns get ther data from very deep down the structure.
例如,我有此HQL,它可以完美运行:
I have this HQL, for example, which works flawlessly:
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
但是这个失败很惨:
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
有人可以指出,我要去哪里错了.这样的深度语法不被支持吗?
Can someone point out, where am I going wrong. Isn't such deep syntax supported or something?
休眠版本为3.2.1.
Hibernate version is 3.2.1.
对不起,忘记了堆栈跟踪:
Sorry, forgot the 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)
.....
推荐答案
正如@JBNizet正确指出的那样,问题在于路径上的某个类(确切地称为address
)不是一个实体,它是一个可嵌入的对象,因此不需要连接.
As @JBNizet correctly pointed out, the problem was that one of the classes (named address
to be exact) on the path was not an entity, it was an embeddable object and thus it doesn't need to be joined.
因此在我的情况下正确编写的第二个查询将是:
So the second query written correctly in my case would be:
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
这篇关于Hibernate从HqlSqlWalker引发NullPointerException的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!