【JPA】關於JPA使用原生多表查詢,返回實體集合的方法 [@FiledResult]註解應用
阿新 • • 發佈:2019-01-25
執行 @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 實體
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 的原生查詢
// List of Object arrays:{[Order, Item], [Order, Item], ...}
預設情況下,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], ...}