【发布时间】:2013-09-30 11:12:28
【问题描述】:
我在 JPA NativeSql 中有一个查询,我在其中执行表和联接的“联合”。我用来自多个表的所有查询字段创建了一个实体。所以我不能像往常一样用 JPA 做“@Column”“@table”。
如何将查询的给定值设置为我的实体?
【问题讨论】:
我在 JPA NativeSql 中有一个查询,我在其中执行表和联接的“联合”。我用来自多个表的所有查询字段创建了一个实体。所以我不能像往常一样用 JPA 做“@Column”“@table”。
如何将查询的给定值设置为我的实体?
【问题讨论】:
您可以使用@SqlResultSetMapping 将本机 SQL 查询返回的列映射到您的实体。
Query q = em.createNativeQuery(
"SELECT o.id AS order_id, " +
"o.quantity AS order_quantity, " +
"o.item AS order_item, " +
"i.name AS item_name, " +
"FROM Order o, Item i " +
"WHERE (order_quantity > 25) AND (order_item = i.id)",
"OrderResults");
@SqlResultSetMapping(name="OrderResults",
entities={
@EntityResult(entityClass=com.acme.Order.class, fields={
@FieldResult(name="id", column="order_id"),
@FieldResult(name="quantity", column="order_quantity"),
@FieldResult(name="item", column="order_item")
})
},
columns={
@ColumnResult(name="item_name")}
)
更多例子可以在here找到。
【讨论】:
您可以为此使用重载的EntityManager#createNativeQuery(sql,resultClass) 方法。
【讨论】:
为什么不把 NATIVE SQL 放到视图中呢?然后只需创建一个映射到视图的实体,就像任何普通实体映射到表一样。唯一的区别是您不能插入、更新或删除基于视图的实体。
【讨论】:
恕我直言,将 DAO 与 JPA 结合使用并不是一个好主意。但是看看Criteria API。您可以像使用CriteriaBuilder 描述的那样构建此类查询。
【讨论】:
JPA 本机 SQL 与通用 SQL 相同。你可以像SQL查询一样做union操作。但是,如果你想用JPQL来做,那么你需要使用EclipseLink,因为JPA的JPQL不支持Union操作。
【讨论】: