当前位置: 首页 > 知识库问答 >
问题:

JPA、@瞬态字段和本机查询映射

梁丘亦
2023-03-14

我有这个实体:

@Entity
@Table(name = "entry")
@SqlResultSetMapping(
    name = "viewEntry",
    entities =
    @EntityResult(entityClass = ViewEntry.class,
            fields = {
                    @FieldResult(name="id", column = "id"),
                    @FieldResult(name="guid", column = "guid"),
                    @FieldResult(name="link", column = "link"),
                    @FieldResult(name="descr", column = "descr"),
                    @FieldResult(name="pubDate", column = "pub_date"),
                    @FieldResult(name="read", column = "my_read")
            }
    )
)
public class ViewEntry implements Serializable {
    @Id
    private Integer id;
    private String guid;
    private String link;
    private String descr;
    private Date pubDate;
    @Transient
    private Boolean read;
}

读取字段位于另一个表中,因此我将其设置为瞬态,以防止JPA映射错误。为了检索实体的内容,我想使用如下所示的本机查询:

select id,guid,link,descr,pub_date,feed_id,user_id,is_read as my_read from entry join user_to_entry ....
-- skipped dynamic part of query

问题是,我不知道如何将本机查询映射到实体。特别是,我不知道EntityManager是否会忽略@Transient字段。请帮忙。

共有3个答案

宿衡虑
2023-03-14

在最坏的情况下,可以使用连接创建视图,并像普通表一样映射视图。您只需要删除hibernate将为您创建的新表。

https://www.w3schools.com/sql/sql_view.asp

岳高明
2023-03-14

您可以在实体中使用第二个表来映射另一个表中的字段。类似这样:

...
@SecondaryTable(name="user_to_entry", 
        pkJoinColumns=@PrimaryKeyJoinColumn(name="entry_id"))
public class ViewEntry implements Serializable {
    @Id
    private Integer id;
    private String guid;
    private String link;
    private String descr;
    @Column(name="pub_date")
    private Date pubDate;
    @Column(table = "user_to_entry")
    private Boolean read;
}

如果由于某种原因不能这样做,可以将本机SQL结果映射到如下实体

em.createNativeQuery("<native SQL>", ViewEntry.class)

但我认为这不会映射瞬态场(我可能错了,还没有测试过)。

第三个选项是使用@SqlResultSetMap,但我也不确定这是否适用于瞬态字段。检查此示例。

姚正真
2023-03-14

要映射本机查询的结果,您可以使用SqlResultSetMapshttp://docs.oracle.com/javaee/7/api/javax/persistence/SqlResultSetMapping.html

如果本机查询中的列与属性名称匹配,或者它们与实体中的@Column映射,则不需要映射。

 类似资料:
  • 当使用jpa本机查询 事务传播是我们正在使用的正确jpa的唯一特性吗? 在我的意见中,我就像使用普通的旧jdbc pluc jpa事务传播 我正在阅读PRO JPA一书,根据我的理解 当我们使用JPA本机查询获取一组标量值时(与我们使用jdbc的方式很相似),实际上没有托管实体和持久性上下文的概念。当我们通过本机查询检索实体时,情况会发生变化。

  • 问题内容: JPA()中的本机查询是否支持缓存? 我正在填写自己的数据传输对象,因为sql查询会联接多个表,并且仅从表中获取几个列。 问候 问题答案: 这是可能的,但 您必须使用显式或。 也可以看看 缓存SQL查询问题 hibernate:真正了解二级和查询缓存

  • 问题内容: 这是有关JPA Transient批注的以下问题的后续解答 为什么JPA具有@Transient批注? 我有一个我不想保留的瞬态变量,并用瞬态注释标记。但是,当我想从我的rest控制器生成JSON时,此瞬态变量在输出的JSON中不可用。 POJO PublicationVO直截了当,没有花哨的属性,只有一些具有getter和setter和1个瞬态变量的私有属性(已保留)。 The Pu

  • 这是关于JPA瞬态注释的以下问题的后续问题,为什么JPA有@Transient注释? 我有一个我不想保留的瞬态变量,它被标记为瞬态注释。但是,当我想从我的rest控制器生成JSON时,这个瞬态变量在输出的JSON中不可用。 POJO PublicationVO是直截了当的,没有奇特的属性,只有一些私有属性(持久化的),带有getter和setter以及1个瞬态变量。 出版物VO如下 当我在日志中看

  • 问题内容: 在Java中进行序列化后,是否可以将字段设置为任何非默认值?我的用例是一个缓存变量- 这就是为什么。我也有一个习惯,即不要更改字段(即,地图的内容已更改,但对象本身保持不变)。但是,这些属性似乎是矛盾的- 尽管编译器允许这样的组合,但除反序列化之后,我无法将字段设置为任何值。 我尝试了以下操作,但没有成功: 简单的字段初始化(如示例所示):这是我通常所做的,但是在未序列化之后似乎没有发