在我的Spring应用程序中,我有一个称为Resource:的实体:
@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();
当我查询ExtendedResource时,这很好用,但是对于Resource我得到了:
org.postgresql.util.PSQLException: The column name DTYPE was not found in this ResultSet.
有什么办法解决这个问题,而不必打扰辨别器列?我猜
MappedSuperclass
是一个解决方案,但我想避免制作额外的类。谢谢
最佳答案
一个小问题,但是没有一些编码就无法解决:)
除了创建@MappedSuperclass
(如您所说的是解决方案)或创建实体层次结构(使用DTYPE
)之外,您还可以在没有结果类的情况下调用em.createNativeQuery(sql)
,这将以List<Object[]>
的形式提供结果。然后,为每行循环创建一个新的ExtendedResource
实例。如果选择此选项,请确保一一指定所有列,而不要使用*
,以确保返回它们的顺序。
这样,您甚至可以在ojit_code类中创建一个@Transient
额外字段,并消除对其他类的需求。
只是个人喜好问题,哪种方法最适合您。 Resource
似乎涉及最少的编码。