我们有一个继承层次结构,如下所示:
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@NamedQuery("select NEW package.BaseClass(bc.field1, bc.field2) from BaseClass b")
public abstract BaseClass {
public BaseClass(int field1, String field2) {
}
}
@Entity
public SubClass1 extends BaseClass {
}
和类似的SubClass2
现在我遇到的问题是这里使用@NamedQuery
语法,这不允许我创建List对象,因为它无法使用构造函数实例化BaseClass。那么有人可以建议如何解决这个问题,同时将命名查询留在基类本身吗?
或者请告诉我是否有办法排除选择中的列,如
select bc.*Field3 from BaseClass
或某些语法可以防止在这种情况下我不需要延迟加载关联字段3?
答案 0 :(得分:1)
你在这里以一种奇怪的方式使用了一些东西。
首先,JPQL构造函数表达式通常与非实体类一起使用。你可以让一些非实体类包含两个字段(field1
和field2
)和一个匹配的构造函数,并在package.BaseClass
中使用它代替@NamedQuery
,它应该是工作。我在这里没有看到使用实体类的重点。如果您希望获得仅BaseClass
和field1
初始化的field2
个实体的列表,那么这不是它的工作原理。但是select bc.field1, bc.field2 from BaseClass b
会起作用,但它会产生一个元组,而不是实体。
此外,默认情况下会急切地提取@OneToOne
和@ManyToOne
,因此这可能是您看到的其他查询触发的原因。明确地将其设置为FetchType.LAZY
,它应该没问题。
关于这个
如何解决这个问题,同时将命名查询留在基类本身
您不必将命名查询保留在基类中,您可以将它放在您想要的任何实体中。一个经常使用的选择是有一个"假的"将在一个地方保存所有命名查询的实体。查看this answer以获取示例。