2015-04-03 188 views
0

我有这样的实体:JPA,@Transient场和原生查询映射

@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 

的问题是,我不知道如何以原生查询映射到我的实体。特别是我不知道@Transient字段是否会被EntityManager忽略。请帮助。

+0

可能是一个错字,但是您在映射中将列指定为'my_read',但在查询中它被称为'is_read'。 – 2015-04-03 09:15:37

+0

据我所知,'column'参数是结果集中别名的名称,'name'参数是该字段的名称。纠正我,如果我错了 – 2015-04-03 09:22:41

+0

你是对的,它只是在原来的文章没有'as my_read'。 – 2015-04-03 09:25:02

回答

2

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

没有一个映射,如果在本地查询列的属性名称相匹配,或者如果他们在实体@Column映射,然后你不” t需要映射。

+1

在这种映射的情况下,瞬态场是否会充满价值?我之前尝试过,并在'read'字段中得到空值。 – 2015-04-03 09:04:48

+0

看看我编辑的问题,看看SqlResultSetMapping我试图用 – 2015-04-03 09:11:18

+1

JPA永远会忽略瞬态字段@瞬态和瞬态(Java关键字)! – 2015-04-03 09:18:02

2

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

... 
@SecondaryTable(name="user_to_entry", 
     [email protected](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为例。

+0

我不能使用@SecondaryTable,因为它只接受键作为映射列。我试过了。 – 2015-04-03 09:08:11

+0

我现在所做的是:'Query query = em.createNativeQuery(sql.toString(),“viewEntry”);'其中'viewEntry'是@SqlResultSetMapping的名称。 – 2015-04-03 09:09:26

+0

它是否适用于瞬态场? – 2015-04-03 09:10:41