JPA:在此ResultSet中找不到列名DTYPE

时间:2015-10-27 15:52:44

标签: java spring hibernate postgresql jpa

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

的实体
$digest

出于一个特定目的,我需要在结果中添加更多字段。所以我创建了一个子类ExtendedResource:

@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();

有没有办法解决这个问题,而没有打扰鉴别器列?我想org.postgresql.util.PSQLException: The column name DTYPE was not found in this ResultSet. 是一个解决方案,但我想避免额外的课程。

谢谢

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

解决方案是:

  • 为超类添加@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,可以更改为您想要的值。