JPA、@Transient 字段和 Native Query 映射
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
驻留在另一个 table 中,所以我将其设为瞬态,以防止 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
没有映射,如果本机查询中的列与属性名称匹配,或者如果它们在实体中使用@Column 映射,则您不需要映射。
您可以通过在您的实体中使用 @SecondaryTable
来映射另一个 table 中的字段。像这样:
...
@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
,但我也不确定这是否适用于瞬态字段。检查 this 示例。
在最坏的情况下,您可以使用联接创建视图并像正常 table 一样映射您的视图。您只需要删除休眠将为您创建的新 table。
我有这个实体:
@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
驻留在另一个 table 中,所以我将其设为瞬态,以防止 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
没有映射,如果本机查询中的列与属性名称匹配,或者如果它们在实体中使用@Column 映射,则您不需要映射。
您可以通过在您的实体中使用 @SecondaryTable
来映射另一个 table 中的字段。像这样:
...
@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
,但我也不确定这是否适用于瞬态字段。检查 this 示例。
在最坏的情况下,您可以使用联接创建视图并像正常 table 一样映射您的视图。您只需要删除休眠将为您创建的新 table。