【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], ...}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JPA使用原生 SQL 进行多查询时,实体类字段赋值可以通过使用 @SqlResultSetMapping 和 @ConstructorResult 注解来实现。 @SqlResultSetMapping 注解用于定义结果集的映射关系,可以指定多个实体类和列名的映射关系。 @ConstructorResult 注解用于指定实体类的构造函数参数与列名的映射关系。 以下是一个使用原生 SQL 进行多查询的示例: ```java @SqlResultSetMapping( name = "UserGroupMapping", classes = @ConstructorResult( targetClass = UserGroupDto.class, columns = { @ColumnResult(name = "userId", type = Long.class), @ColumnResult(name = "userName", type = String.class), @ColumnResult(name = "groupId", type = Long.class), @ColumnResult(name = "groupName", type = String.class) } ) ) public interface UserDao extends JpaRepository<User, Long> { @Query( value = "SELECT u.id AS userId, u.name AS userName, g.id AS groupId, g.name AS groupName " + "FROM user u LEFT JOIN user_group ug ON u.id = ug.user_id " + "LEFT JOIN group g ON ug.group_id = g.id " + "WHERE u.id = :userId", nativeQuery = true, resultSetMapping = "UserGroupMapping" ) UserGroupDto getUserGroup(@Param("userId") Long userId); } ``` 在上面的示例中,我们定义了一个名为 UserGroupMapping 的映射关系,将多个实体类和列名的映射关系定义在了 @ConstructorResult 注解中。在 UserDao 接口中,我们使用 @Query 注解指定了原生 SQL 语句,并通过 resultSetMapping 属性将结果集映射到 UserGroupDto 类中,从而实现了多查询并将结果封装到一个自定义的 DTO 类中。 另外,需要注意的是,如果原生 SQL 查询返回的结果集中包含实体类中不存在的字段,那么这些字段的值将不会被赋值给实体类的属性。因此,需要确保查询语句中的列名与实体类中的属性名一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值