Querydsl:child class 上的字段未正确初始化

Querydsl: a field is not properly initialised on the child class

美好的一天,

我们正在使用 qdsl 访问我们继承的 objects。我们有一个 parent class (Parent),它有一个复杂的 object (BasicProduct) 作为字段。然后我们有几个children(其中一个是Child)。在查询中,我们试图从 QChild 自动生成的代码访问 BasicProduct。从我们所看到的——访问 BasicProduct 的字段存在于 QParentQChild 上,但只有 QParent 上的字段被正确初始化。

objects 的结构是:

Parent object -

@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;
}

Child object -

@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);

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

如果您查看生成的 QChild,它应该包含从其父级继承的字段(字段上方有 ///inherited 注释)。所有继承的字段都是public final,所以你可以使用它们。

也就是说,basicProductQChild 中,您可以访问它 - 从您的代码中删除括号

而不是

.leftJoin(child.basicProduct(), basicProduct)

你应该

.leftJoin(child.basicProduct, basicProduct)

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

也尝试在 QChild 上设置 entityAccessors。