0

我有这个实体:

@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 字段。请帮忙。

4

3 回答 3

2

@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,但我也不确定这是否适用于瞬态字段。检查这个作为一个例子。

于 2015-04-03T09:06:09.340 回答
2

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

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

于 2015-04-03T09:01:16.433 回答
0

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

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

于 2021-10-27T11:35:50.063 回答