2012-09-26 36 views
2

让我们假设我有3个抽象超类:SuperASuperBSuperC。 让我们假设每个超类都有很多更具体的实现,并且所有的超类都注有@Inheritance(strategy = InheritanceType.JOINED)JPQL和继承

更具体的:

  • Aa < - SuperA并具有SuperB(的bbs属性)的列表;
  • Bb < - SuperB并且具有列表SuperCccs属性);
  • Cc < - SuperC并具有foo属性。

然后,当我尝试类似下面的查询,我得到了一个错误,指出它无法在类型SuperC找物业fooBb有一个抽象类型的列表,我不能改变它。所以,我不知道如何使查询有效。

select a from Aa a left outer join a.bbs b where b.ccs.foo = :foo 

任何提示都会有所帮助。提前致谢。


编辑:

BTW:异常:

org.hibernate.exception.SQLGrammarException: Unknown column 'cc3_1_.foo' in 'where clause'


编辑2:

我找JPA文档,发现something可以工作,如果我不使用Hibernate。


编辑3:

我改变它使用两个SQL的。首先,我找到了基于foo属性的C的id,然后我只是用查询比较id。

这里的问题是,我必须每次都要做2个SQL ......但是,至少它是有效的。

+0

它的气味就像你的ORM框架的一个bug,只是因为你想访问'Cc'表中的属性/字段而不是'SuperC'。 Programaticaly你应该使和明确投到SuperC.foo .... –

+0

一个问题,这是一个生成的查询或手动建立? –

+0

基于这篇文章[链接] http://www.java。net/node/668740 [/ link],你可以在你的映射中使用后代类代替你的超级类...'class Aa {private List ccs; ....' –

回答

2

你需要一个更加入了抄送的名单则应该是罚款:

select a from Aa a left outer join a.bbs b join b.ccs c where c.foo = :foo 

为CCS是无法“取消引用”这是物业这样的列表,如果你你能止跌”您可以简单地写:a.bbs.ccs.foo但这不是的情况,所以您需要按照上面的说明加入列表。

+0

谢谢。有用 – caarlos0