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
的字段存在于 QParent
和 QChild
上,但只有 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
,所以你可以使用它们。
也就是说,basicProduct
在 QChild
中,您可以访问它 - 从您的代码中删除括号
而不是
.leftJoin(child.basicProduct(), basicProduct)
你应该
.leftJoin(child.basicProduct, basicProduct)
看起来您生成了混合类型的实体访问器。 Parent 似乎有 entityAccessors 而 Child 没有。当 QChild 中的字段未初始化时,这可能会导致问题。
也尝试在 QChild 上设置 entityAccessors。
美好的一天,
我们正在使用 qdsl 访问我们继承的 objects。我们有一个 parent class (Parent
),它有一个复杂的 object (BasicProduct
) 作为字段。然后我们有几个children(其中一个是Child
)。在查询中,我们试图从 QChild
自动生成的代码访问 BasicProduct
。从我们所看到的——访问 BasicProduct
的字段存在于 QParent
和 QChild
上,但只有 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
,所以你可以使用它们。
也就是说,basicProduct
在 QChild
中,您可以访问它 - 从您的代码中删除括号
而不是
.leftJoin(child.basicProduct(), basicProduct)
你应该
.leftJoin(child.basicProduct, basicProduct)
看起来您生成了混合类型的实体访问器。 Parent 似乎有 entityAccessors 而 Child 没有。当 QChild 中的字段未初始化时,这可能会导致问题。
也尝试在 QChild 上设置 entityAccessors。