JPA:在此ResultSet中未找到列名DTYPE。

8
在我的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 是一个解决方案,但是我想避免创建额外的类。

谢谢。

3个回答

5

这是一个微不足道的问题,但没有编码是解决不了的 :)

除了创建@MappedSuperclass(就像你说的那样,这是一种解决方案)或创建一个带有DTYPE 的实体层次结构,也可以调用em.createNativeQuery(sql)而不使用结果类,这将以List<Object[]>的形式给出结果。然后,在循环中为每一行创建一个ExtendedResource的新实例即可。如果您选择这个选项,请确保逐一指定所有列,而不是使用*, 来确保它们返回的顺序。

这样,您甚至可以在Resource类中创建一个@Transient额外字段,省去了需要添加的额外类。

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


谢谢,我会选择 @MappedSuperclass。我认为 List<Object[]> 不是一个选项,因为我还需要获取一些关联数据。 - user3170702

5

0

解决方案是:

  • 为超类添加@DiscriminatorValue("0")。
  • 0作为dtype添加到选择字段中。

    @Entity
    @DiscriminatorValue("0")
    public class Resource {...}
    
    List<Resource> list = em
      .createNativeQuery("select 0 as dtype, r.* from ...", Resource.class)
      .getResultList();
    

0 是超类的鉴别器值,可以更改为您想要的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接