现有一个类别表web_reforger_kind,字段分别为id,superId,name
id为类别主键,name为类别名称,superId为上级类别(如果superId为0,表示顶级类别,否则上级类别为id等于superId的类别)现查询不是终极类别(不是最后一级类别,即:有子类别的类别)的所有类别:
HQL:
select a from WebReforgerKind a left join cn.reforger.reforgerKind.WebReforgerKind b where a.superId=b.id and b.superId=0 order by a.superId,idWebReforgerKind.hbm.xml<hibernate-mapping>
    <class name="reforgerKind.WebReforgerKind" table="web_reforger_kind" catalog="reforger"  lazy="false">
        <id name="id" type="java.lang.Integer">
            <column name="id" />
            <generator class="identity" />
        </id>
        <property name="superId" type="java.lang.Integer">
            <column name="superID" not-null="true" />
        </property>
        <property name="name" type="java.lang.String">
            <column name="name" length="40" not-null="true" />
        </property>
        <many-to-one name="id" class="reforgerKind.WebReforgerKind" not-null="false" insert="false" update="false">
<column name="superId" />
</many-to-one>
    </class>
</hibernate-mapping>出现如下错误信息:
java.lang.NullPointerException
at org.hibernate.hql.ast.HqlSqlWalker.createFromJoinElement(HqlSqlWalker.java:332)
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:251)
at org.hibernate.hql.ast.QueryTranslatorImpl.doCompile(QueryTranslatorImpl.java:183)
at org.hibernate.hql.ast.QueryTranslatorImpl.compile(QueryTranslatorImpl.java:134)
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.AbstractSessionImpl.getHQLQueryPlan(AbstractSessionImpl.java:156)
at org.hibernate.impl.AbstractSessionImpl.createQuery(AbstractSessionImpl.java:135)
at org.hibernate.impl.SessionImpl.createQuery(SessionImpl.java:1650)
请问是我的HQL错误?还是配置有问题?

解决方案 »

  1.   

    自关联的映射要配置一对多和多对以的关系,例如
    public class WebReforgerKind{
    private WebReforgerKind parent;
    private Set subWebReforgerKinds;
    ......
    }
    hbm.xml文件如下:
            <many-to-one name="parent" class="xxx.WebReforgerKind" cascade="none"  column="superId"/>
            <set name="children" lazy="false" inverse="true">
                <key column="superId"></key>
    <one-to-many class="xxx.WebReforgerKind"/>
            </set>
    可以设置lazy="false",也可以用fetch来查询
    from WebReforgerKind a left join fetch a.subWebReforgerKinds  ......
      

  2.   


    可以拿我的表做示例说明一下吗?你写的WebReforgerKind类看不太懂
      

  3.   

    楼主,我就是用的你的类呀,请仔细看看吧
    private WebReforgerKind parent;//自关联的父亲多对1
    private Set subWebReforgerKinds;//孩子一对多
      

  4.   

    1楼正解,Hibernate无on关键字,靠的就是对应的父子关系自动生成的连接, a left join a.b会翻译成 a left join b on xxx