JPA 2.0中当前事务中执行一些任意sql

2024-01-05

我是 JPA 2.0/EclipseLink/Glassfish/JEE6 的新手,有一个基本问题。

我有一个 DAO,其中大多数实体都使用 JPA 注释直接映射到列,因此我使用 EntityManager,它工作得很好,没有任何问题。

然而,有一些表是我自己构建 SQL 语句的,因为它们使用 Oracle 特定的函数(空间),并且我想要对 SQL 进行非常细粒度的控制。所以我用字符串连接来构建它。我希望能够在当前事务中注册我的 SQL 执行(如果已经有一个事务正在进行)。

因此,我自然不想直接进入 DriverManager 并创建自己的连接,我一直在寻找某种 EntityManager.executeArbitrarySQL(String) 函数来查找当前连接并使我的 SQL 成为当前事务的一部分。我疯了吗?


一个可以使用EntityManager.createNativeQuery()在您使用的同一个 EntityManager 的上下文中执行本机 SQL 查询的方法。这些方法有 two 三种不同类型,它们提供的参数有所不同。

首先,createNativeQuery(String sqlString, Class resultClass) http://download.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#createNativeQuery%28java.lang.String,%20java.lang.Class%29期望您提供表示查询将返回的值的类型的 Class 对象。如果您返回一组可以映射到持久性单元中另一个实体定义的类的值,则可以使用此方法。

第二createNativeQuery(String sqlString, String resultSetMapping) http://download.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#createNativeQuery%28java.lang.String,%20java.lang.String%29期望您提供结果集映射的名称。结果集映射应该使用以下方式定义@SqlResultSetMapping http://download.oracle.com/javaee/6/api/javax/persistence/SqlResultSetMapping.html注解。

最后createNativeQuery(String sqlString) http://download.oracle.com/javaee/6/api/javax/persistence/EntityManager.html#createNativeQuery%28java.lang.String%29显然是用于不返回结果集的场景,即执行 INSERT、UPDATE 和 DELETE 语句。

您还可以使用以下命令定义本机查询@NamedNativeQuery http://download.oracle.com/javaee/6/api/javax/persistence/NamedNativeQuery.html注释或named-native-query你的元素persistence.xml文件,但这些更适合您在开发过程中了解查询结构的场景。但是,您可以创建多个此类命名的本机查询来表示您打算执行的各种 SQL 语句,然后根据用户输入在运行时执行不同的语句。带注释的本机查询使用EntityManager.createNamedQuery()方法。人们需要使用位置参数(使用?占位符)以在运行时向本机查询提供值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA 2.0中当前事务中执行一些任意sql 的相关文章

随机推荐