让我们假设我有3个抽象超类:SuperA
,SuperB
和SuperC
。 让我们假设每个超类都有很多更具体的实现,并且所有的超类都注有@Inheritance(strategy = InheritanceType.JOINED)
。JPQL和继承
更具体的:
Aa
< -SuperA
并具有SuperB
(的bbs
属性)的列表;Bb
< -SuperB
并且具有列表SuperC
(ccs
属性);Cc
< -SuperC
并具有foo
属性。
然后,当我尝试类似下面的查询,我得到了一个错误,指出它无法在类型SuperC
找物业foo
。 Bb
有一个抽象类型的列表,我不能改变它。所以,我不知道如何使查询有效。
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 ......但是,至少它是有效的。
它的气味就像你的ORM框架的一个bug,只是因为你想访问'Cc'表中的属性/字段而不是'SuperC'。 Programaticaly你应该使和明确投到SuperC.foo .... –
一个问题,这是一个生成的查询或手动建立? –
基于这篇文章[链接] http://www.java。net/node/668740 [/ link],你可以在你的映射中使用后代类代替你的超级类...'class Aa {private List ccs; ....' –