JPA:将本机查询结果转换为 POJO 类
问题:
在 JPA 中,执行本机查询时,结果通常作为对象数组或数组列表返回。有没有办法直接将此结果转换为与结果集具有相同列名的 Java POJO(普通旧 Java 对象)类的集合?
解决方案:
使用映射实体(JPA 2.0 和上面)
JPA 2.0 及以上版本允许将本机查询结果映射到持久化上下文中映射实体的 POJO。要实现此目的,请使用 @Entity 注释 POJO 类,并使用命名的本机查询,并将 resultClass 设置为 POJO 类:
@NamedNativeQuery( name = "nativeSQL", query = "SELECT * FROM Actors", resultClass = Actor.class )
手动映射
对于情况如果使用映射实体不可行,则可以使用手动映射。这涉及创建一个方法,该方法将对象数组(元组)作为输入,并使用反射将其映射到 POJO:
public static <T> T map(Class<T> type, Object[] tuple) { // ... (Reflection code omitted for brevity) }
使用 @SqlResultSetMapping(JPA 2.1 及更高版本)
JPA 2.1 引入了 @SqlResultSetMapping 注解,它允许原生查询的自定义映射结果到 POJO。在实体或 orm.xml 文件中定义映射并在本机查询中使用它:
@SqlResultSetMapping( name = "JediResult", classes = { @ConstructorResult( targetClass = Jedi.class, columns = { @ColumnResult(name = "name"), @ColumnResult(name = "age") } ) } )
Query query = em.createNativeQuery("SELECT name,age FROM jedis_table", "JediResult");
使用 XML 映射
而不是使用注释,可以在 orm.xml 文件中定义自定义结果集映射,从而实现更集中的配置。
<sql-result-set-mapping name="JediMapping"> <constructor-result target-class="org.answer.model.Jedi"> <column name="name" class="java.lang.String"/> <column name="age" class="java.lang.Integer"/> </constructor-result> </sql-result-set-mapping>
以上是如何将本机查询结果转换为 JPA 中的 POJO?的详细内容。更多信息请关注PHP中文网其他相关文章!