JPA本机查询返回具有多个表的字段的实体
我在JPA NativeSql中有一个查询,我在那里做表和联接的“联合”,我用所有查询字段创建了一个实体,来自多个表的那些字段,即我不能像通常那样“@colum”“@ 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")} )
更多例子可以在这里找到。
您可以使用重载的EntityManager#createNativeQuery(sql,resultClass)方法。
恕我直言,使用DAO与JPA不是一个好主意。 但是看看Criteria API 。 您可以构建类似于您使用CriteriaBuilder描述的查询。
JPA
本机SQL
与通用SQL
相同。 你可以像SQL
查询那样进行union
操作。 但是,如果你想用JPQL
做,那么你需要使用EclipseLink
,因为JPA
JPQL
不支持Union操作。
为什么不将NATIVE SQL放入视图中? 然后只需创建一个映射到视图的实体,就像任何普通实体将映射到表一样。 唯一的区别是您无法根据视图插入,更新或删除实体。