JPA本机查询返回具有多个表的字段的实体

时间:2013-09-30 11:12:28

标签: java jpa

我在JPA NativeSql中有一个查询,在那里我做表和联接的“联合”。我创建了一个包含来自多个表的所有查询字段的实体。所以我不能像往常一样用JPA做“@Column”“@ table”。

如何将查询的给定值设置为我的实体?

5 个答案:

答案 0 :(得分:9)

您可以使用@SqlResultSetMapping将本机SQL查询返回的列映射到您的实体。

Example

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

答案 1 :(得分:1)

您可以使用重载的EntityManager#createNativeQuery(sql,resultClass)方法。

答案 2 :(得分:0)

使用带有JPA的DAO的恕我直言并不是一个好主意。但是看看Criteria API。您可以构建类似于您使用CriteriaBuilder描述的查询。

答案 3 :(得分:0)

JPA原生SQL与通用SQL相同。您可以执行与union查询相同的SQL操作。但是,如果您希望使用JPQL,而不是需要使用EclipseLink,则JPQL的{​​{1}}不支持联盟操作。

答案 4 :(得分:0)

为什么不将NATIVE SQL放入视图中?然后只需创建映射到视图的实体,就像任何普通实体将映射到表一样。唯一的区别是您无法根据视图插入,更新或删除实体。