【问题标题】:JPA: The column name DTYPE was not found in this ResultSetJPA:在此 ResultSet 中找不到列名 DTYPE
【发布时间】:2016-01-27 03:16:47
【问题描述】:

在我的 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 时,这很好用,但是对于我得到的资源:

org.postgresql.util.PSQLException: The column name DTYPE was not found in this ResultSet.

有什么办法可以解决这个问题,而不用担心鉴别器列吗?我猜MappedSuperclass 是一个解决方案,但我想避免制作额外的课程。

谢谢

【问题讨论】:

    标签: java spring hibernate postgresql jpa


    【解决方案1】:

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

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

    这样,您甚至可以在Resource 类中创建一个@Transient 额外字段,而无需额外的类。

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

    【讨论】:

    • 谢谢,我会选择@MappedSuperclass。我不认为List&lt;Object[]&gt; 是一个选项,因为我还有一些需要获取的关联。
    【解决方案2】:

    我认为您将不得不定义 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

    【讨论】:

      【解决方案3】:

      解决办法是:

      • 为超类添加@DiscriminatorValue("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,可以改成你想要的值。

      【讨论】:

        猜你喜欢
        • 2015-08-04
        • 2021-06-05
        • 2014-02-11
        • 2021-03-02
        • 2019-10-26
        • 2018-09-23
        • 2021-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多