[英]JPA, @Transient field and Native Query mapping
我有這個實體:
@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 映射錯誤。 要檢索實體的內容,我想使用如下所示的本機查詢:
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 字段。 請幫忙。
要映射本機查詢的結果,可以使用SqlResultSetMapping http://docs.oracle.com/javaee/7/api/javax/persistence/SqlResultSetMapping.html
如果本機查詢中的列與屬性名稱匹配,或者如果它們與Entity中的@Column映射,則沒有映射。則不需要映射。
您可以通過使用實體中的@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;
}
如果由於某種原因無法執行此操作,則可以將本機SQL結果映射到這樣的實體
em.createNativeQuery("<native SQL>", ViewEntry.class)
但是我認為這不會映射瞬態場(我可能是錯的,尚未測試)。
第三種選擇是使用@SqlResultSetMapping
,但我也不確定這是否適用於瞬態字段。 查看此示例。
在最壞的情況下,您可以使用連接創建一個視圖,並像普通表一樣映射您的視圖。 您只需要刪除 hibernate 將為您創建的新表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.