在我的Spring应用程序中,我有一个名为Resource ::
的实体$digest
出于一个特定目的,我需要在结果中添加更多字段。所以我创建了一个子类ExtendedResource:
@Entity
public class Resource {
List<Resource> list = em.createNativeQuery("select r.* from ...", Resource.class).getResultList();
当我查询ExtendedResource时,这可以正常工作,但对于资源我得到:
@Entity
public class AreaResource extends Resource {
@Column(name="extra_field")
private Integer extra field;
List<ExtendedResource> list = em.createNativeQuery("select extra_field, r.* from ...", ExtendedResource.class).getResultList();
有没有办法解决这个问题,而没有打扰鉴别器列?我想org.postgresql.util.PSQLException: The column name DTYPE was not found in this ResultSet.
是一个解决方案,但我想避免额外的课程。
谢谢
答案 0 :(得分:3)
一个微不足道的问题,但如果没有一些编码就无法解决问题:)
除了创建@MappedSuperclass
(正如您所说,是一个解决方案)或创建实体层次结构(使用DTYPE
)之外,您可以调用em.createNativeQuery(sql)
而不会生成类,它会以List<Object[]>
的形式给你结果。然后,为每一行在循环中创建ExtendedResource
的新实例。如果您选择此选项,请确保逐个指定所有列,而不是使用*
,以确保它们的返回顺序。
这样,您甚至可以在@Transient
课程中创建一个Resource
额外字段,并且无需额外的课程。
这只是个人偏好的问题,哪种方法最适合您。 @MappedSuperclass
似乎涉及的编码量最少。
答案 1 :(得分:1)
我认为您必须定义DiscriminatorColumn。
如果未在实体层次结构的根类上指定@Inheritance注释,则使用默认策略InheritanceType.SINGLE_TABLE。
使用单表策略,整个类层次结构将保留在一个大的单个表中。需要使用鉴别器列来区分特定行中保留的类类型
要用作鉴别器列的列的默认名称是DTYPE。
https://docs.oracle.com/javaee/6/api/javax/persistence/DiscriminatorColumn.html https://docs.oracle.com/javaee/6/tutorial/doc/bnbqn.html
答案 2 :(得分:0)
解决方案是:
将0 as dtype
添加到选择字段中。
@Entity
@DiscriminatorValue("0")
public class Resource {...}
List<Resource> list = em
.createNativeQuery("select 0 as dtype, r.* from ...", Resource.class)
.getResultList();
0是超类DiscriminatorValue,可以更改为您想要的值。