在我的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实例。如果选择此选项,请确保一一指定所有列,而不要使用*,以确保返回它们的顺序。

这样,您甚至可以在o​​jit_code类中创建一个@Transient额外字段,并消除对其他类的需求。

只是个人喜好问题,哪种方法最适合您。 Resource似乎涉及最少的编码。

09-26 05:36