java - JPA、@Transient 字段和 native 查询映射

标签 java jpa nativequery

我有这个实体:

@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;
}

字段read驻留在另一个表中,所以我将其设置为暂时的,以防止JPA映射错误。为了检索实体的内容,我想使用如下所示的 native 查询:

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

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

最佳答案

您可以使用 @SecondaryTable 映射另一个表中的字段在您的实体中。像这样的事情:

...
@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;
}

如果由于某种原因无法做到这一点,您可以将 native SQL 结果映射到这样的实体

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

但我不认为这会映射 transient 字段(我可能是错的,没有测试过)。

第三个选项是使用@SqlResultSetMapping,但我也不确定这是否适用于 transient 字段。检查this举个例子。

关于java - JPA、@Transient 字段和 native 查询映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29429000/

相关文章:

java - 如何在使用 Spring Data JPA nativeQuery 时用参数值替换表名称

java - 在spring mvc中删除url重写中的jsessionid

java - 使用 ContentExchange 设置请求属性

java - 如何使用maven过滤依赖jar中的资源?

java - 从表示数据库行的 Map<String,String> 创建 JPA 实体

java - jpa 2和hibernate一起+hibernate自定义类型+spring

java - 如何在 Java 运行时使用 Spring 执行原生 SQL 查询?

java - Vaadin 中单击的相对坐标

java - 来自不同持久单元的 JPA 实体映射

one-to-many - 如何使用@SqlResultSetMapping 将一对多 native 查询结果映射到 POJO 类