我在 JPA NativeSql 中有一个查询,我在其中对表和连接进行“联合”。我用来自多个表的所有查询字段创建了一个实体。所以我不能像往常一样用JPA做“@Column”“@table”。
如何将查询的给定值设置为我的实体?
您可以使用 .将本机 SQL 查询返回的列映射到您的实体@SqlResultSetMapping
。
示例:
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")}
)
更多示例可以在这里找到。
为什么不把 NATIVE SQL 放到一个视图中呢?然后只需创建一个映射到视图的实体,就像任何普通实体映射到表一样。唯一的区别是您不能插入、更新或删除基于视图的实体。
您可以为此使用重载的EntityManager#createNativeQuery(sql,resultClass)方法。
JPA
nativeSQL
与 generic 相同SQL
。您可以执行与查询union
相同的操作。SQL
但是,如果你想用JPQL
,而不是你需要使用EclipseLink
,因为 JPQL
不JPA
支持 Union 操作。
恕我直言,将 DAO 与 JPA 一起使用并不是一个好主意。但是看看Criteria API。您可以像使用CriteriaBuilder描述的那样构建此类查询。