JPA:在此结果集中找不到列名 DTYPE

use*_*702 5 java postgresql spring hibernate jpa

在我的 Spring 应用程序中,我有一个名为 Resource:: 的实体

@Entity
public class Resource {

List<Resource> list = em.createNativeQuery("select r.* from ...", Resource.class).getResultList();
Run Code Online (Sandbox Code Playgroud)

出于一个特定目的,我需要向结果中添加更多字段。所以我创建了一个子类 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();
Run Code Online (Sandbox Code Playgroud)

当我查询 ExtendedResource 时,这工作正常,但对于 Resource 我得到:

org.postgresql.util.PSQLException: The column name DTYPE was not found in this ResultSet.
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题,而不用打扰鉴别器列?我想MappedSuperclass是一个解决方案,但我想避免制作额外的课程。

谢谢

Pre*_*ric 5

一个微不足道的问题,但没有一些编码就无法解决它:)

除了创建 a @MappedSuperclass(正如您所说,这是一个解决方案)或创建实体层次结构(使用DTYPE),您可以在em.createNativeQuery(sql)没有结果类的情况下进行调用,这将以List<Object[]>. 然后,为每一行在ExtendedResource循环中创建一个新实例。如果您选择此选项,请确保您一一指定所有列而不是使用*,以确保它们返回的顺序。

这样,您甚至可以@TransientResource类中创建一个额外的字段,并消除对额外类的需要。

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


小智 5

我认为您必须定义 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