hibernate同一张表的左链接问题

japhone 2009-06-10 02:42:58
现有一个类别表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,id

WebReforgerKind.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错误?还是配置有问题?
...全文
79 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
zgxzowen 2009-06-10
  • 打赏
  • 举报
回复
1楼正解,Hibernate无on关键字,靠的就是对应的父子关系自动生成的连接, a left join a.b会翻译成 a left join b on xxx
Landor2004 2009-06-10
  • 打赏
  • 举报
回复
楼主,我就是用的你的类呀,请仔细看看吧
private WebReforgerKind parent;//自关联的父亲多对1
private Set subWebReforgerKinds;//孩子一对多
japhone 2009-06-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 Landor2004 的回复:]
自关联的映射要配置一对多和多对以的关系,例如

Java codepublic class WebReforgerKind{
private WebReforgerKind parent;
private Set subWebReforgerKinds;
......
}


hbm.xml文件如下:

XML code <many-to-one name="parent" class="xxx.WebReforgerKind" cascade="none" column="superId"/>
<set name="children" lazy="false" inverse="true">
<key column="su…
[/Quote]

可以拿我的表做示例说明一下吗?你写的WebReforgerKind类看不太懂
Landor2004 2009-06-10
  • 打赏
  • 举报
回复
自关联的映射要配置一对多和多对以的关系,例如
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  ......

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧