1. 程式人生 > >【JPA】關於JPA使用原生多表查詢,返回實體集合的方法 [@FiledResult]註解應用

【JPA】關於JPA使用原生多表查詢,返回實體集合的方法 [@FiledResult]註解應用

執行 @NamedNativeQuery 時,它可以返回實體(包括不同型別的實體)、標量值或實體和標量值的組合。
預設情況下,JPA 持續性提供程式假設在使用 @EntityResult 返回實體時,SELECT 語句將包含與返回的實體的所有欄位或
屬性相對應的所有列,且SELECT 語句中的列名對應於欄位或屬性名(未使用AS 語句)。
如果 SELECT 語句只包含某些與返回的實體的欄位或屬性相對應的列,或 SELECT 語句中的列名並不對應於欄位或屬性名
(使用了 AS 語句),則在使用 @EntityResult 返回實體時,請使用 @FieldResult 批註將 SELECT 語句中的列對映到欄位
或屬性。
有䎔詳細資訊,另請參閱 @ColumnResult 和 @SqlResultSetMapping。
表1-15 列出了此批註的屬性。有䎔更多詳細資訊,請參閱 API。
表1-15 @FieldResult 屬性
屬性 必需說明
column 將 column 設定為 SELECT 語句中使用的列的 String 名稱。如果在 SELECT 中使用列䫲名(AS 語
句),請將 column 設定為列䫲名。
name 將 name 設定為實體的欄位或屬性名(作為 String),該名稱對應於 column 屬性指定的列名。
示例1-32 顯示瞭如何使用此批註將 Order 和 Item(請參閱示例1-33)實體包含在結果列表(請參閱示例1-34)中。在該
示例中,結果列表將為 Object 陣列的 List,如:{[Order, Item], [Order, Item], ...}。
示例1-32 使用@EntityResult 和@FieldResult 的Order 實體
@SqlResultSetMapping(
name="OrderResults",
entities={
@EntityResult(
entityClass=Order.class, 
fields={
@FieldResult(name="id", column="order_id"),
@FieldResult(name="quantity", column="order_quantity"),
@FieldResult(name="item", column="order_item")
}
),
@EntityResult(
entityClass=Item.class,
fields={
@FieldResult(name="id", column="item_id"),
@FieldResult(name="name", column="item_name"),
}
)
}
)
@Entity
public class Order {
@Id
protected int id;
protected long quantity;
protected Item item;
...
}


http://www.oracle.com/technology/global/cn/produ...plink/jpa/resources/toplink-jpa-annotations.html(第23/70 頁)[2008-3-17 16:47:57]
1 JPA 批註參考
示例1-33 Item 實體
@Entity
public class Item {
@Id
protected int id;
protected String name;
...
}
示例1-34 結合使用@SqlResultSetMapping 與@EntityResult 的原生查詢
Query q = entityManager.createNativeQuery(
"SELECT o.id AS order_id, " +
"o.quantity AS order_quantity, " +
"o.item AS order_item, " + 
"i.id AS item_id, " +
"i.name AS item_name, " +
"FROM Order o, Item i " +
"WHERE (order_quantity > 25) AND (order_item = i.id)",
"OrderResults"
);
List resultList = q.getResultList(); 


// List of Object arrays:{[Order, Item], [Order, Item], ...}