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

标签 glassfish jpa-2.0 eclipselink java-ee-6

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

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

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

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

最佳答案

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

第一个,createNativeQuery(String sqlString, Class resultClass)期望您提供表示查询将返回的值的类型的 Class 对象。如果您返回一组可以映射到持久性单元中另一个实体定义的类的值,则可以使用此方法。

第二个createNativeQuery(String sqlString, String resultSetMapping)期望您提供结果集映射的名称。结果集映射应该使用 @SqlResultSetMapping 定义注释。

最后createNativeQuery(String sqlString)显然是用于不返回结果集的场景,即执行 INSERT、UPDATE 和 DELETE 语句。

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

关于glassfish - JPA 2.0中当前事务中执行一些任意sql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6474199/

相关文章:

java - Liferay集群

java - JPA2 Criteria API 更可取的真实示例有哪些?

java - 使用 Jersey 客户端 2.2 版的 Restful WebService 调用

java.lang.illegalstateException无法检索entitymanagerfactory的unitname null

jakarta-ee - 我需要安装 Glassfish 吗?

java - 失败时显示查询绑定(bind)的参数

java - EclipseLink MOXy,对象图中的循环

java - NoSuchMethodException : getProperties on jar execution

database - 如何手动实现JPA关系OneToMany