Querydsl:在子类上没有正确初始化字段

时间:2015-03-09 11:09:50

标签: java querydsl

美好的一天,

我们正在使用qdsl来访问我们继承的对象。我们有一个父类(Parent),它有一个复杂的对象(BasicProduct)作为字段。然后我们有几个孩子(其中一个是Child)。在查询中,我们尝试从BasicProduct自动生成的代码访问QChild。从我们看到的内容 - BasicProductQParent上都存在访问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);

上面的访问查询无法构建。我们做错了什么?

2 个答案:

答案 0 :(得分:2)

看起来你有混合类型的实体访问器生成。父似乎有entityAccessors而Child没有。当QChild中的字段未初始化时,这可能会导致问题。

尝试在QChild上设置entityAccessors。

答案 1 :(得分:1)

如果您查看生成的QChild,则应该包含从其父级继承的字段(在该字段上方添加///inherited条评论)。所有继承的字段都是public final,因此您可以使用它们。

也就是说,basicProduct位于QChild,您可以访问它 - 从代码中删除括号

而不是

.leftJoin(child.basicProduct(), basicProduct)
你应该

.leftJoin(child.basicProduct, basicProduct)