首页 >Java >java教程 >如何将本机查询结果转换为 JPA 中的 POJO?

如何将本机查询结果转换为 JPA 中的 POJO?

DDD
DDD原创
2024-12-11 21:36:12782浏览

How to Convert Native Query Results to POJOs in JPA?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn