美好的一天,
我们正在使用qdsl来访问我们继承的对象。我们有一个父类(Parent
),它有一个复杂的对象(BasicProduct
)作为字段。然后我们有几个孩子(其中一个是Child
)。在查询中,我们尝试从BasicProduct
自动生成的代码访问QChild
。从我们看到的内容 - BasicProduct
和QParent
上都存在访问QChild
字段的字段,但只有QParent
上的字段才能正确初始化。
对象的结构是:
父对象 -
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
name="TYPE",
discriminatorType= DiscriminatorType.STRING)
public abstract class Parent
//bunch of fields
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "BASIC_PRODUCT_ID")
protected BasicProduct basicProduct;
}
子对象 -
@DiscriminatorValue(value = "Child")
public class Child extends Parent {
//bunch of fields
}
访问查询:
HibernateQuery query = new HibernateQuery(session);
query = query.distinct().from(thing)
.leftJoin(thing.childSet, child)
.leftJoin(child.basicProduct(), basicProduct)
.leftJoin(child.basicProduct().fieldA, fieldA)
.leftJoin(basicProduct.fieldB, fieldB);
上面的访问查询无法构建。我们做错了什么?
答案 0 :(得分:2)
看起来你有混合类型的实体访问器生成。父似乎有entityAccessors而Child没有。当QChild中的字段未初始化时,这可能会导致问题。
尝试在QChild上设置entityAccessors。
答案 1 :(得分:1)
如果您查看生成的QChild
,则应该包含从其父级继承的字段(在该字段上方添加///inherited
条评论)。所有继承的字段都是public final
,因此您可以使用它们。
也就是说,basicProduct
位于QChild
,您可以访问它 - 从代码中删除括号
而不是
.leftJoin(child.basicProduct(), basicProduct)
你应该
.leftJoin(child.basicProduct, basicProduct)