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是一个解决方案,但我想避免制作额外的课程。
谢谢
一个微不足道的问题,但没有一些编码就无法解决它:)
除了创建 a @MappedSuperclass(正如您所说,这是一个解决方案)或创建实体层次结构(使用DTYPE),您可以在em.createNativeQuery(sql)没有结果类的情况下进行调用,这将以List<Object[]>. 然后,为每一行在ExtendedResource循环中创建一个新实例。如果您选择此选项,请确保您一一指定所有列而不是使用*,以确保它们返回的顺序。
这样,您甚至可以@Transient在Resource类中创建一个额外的字段,并消除对额外类的需要。
哪种方法最适合您,这只是个人喜好的问题。@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
| 归档时间: |
|
| 查看次数: |
7580 次 |
| 最近记录: |