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

Kev*_*uli 2 glassfish eclipselink java-ee-6 jpa-2.0

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

我有一个DAO,其中大多数实体使用JPA注释直接映射到列,所以我使用EntityManager,它没有问题,效果很好.

但是有一些表我自己构建SQL语句b/c他们使用oracle特定的函数(空间),我想要非常细粒度的SQL控制.所以我用字符串连接来构建它.我希望能够在当前事务中注册我的SQL执行,如果有一个已经在进行中.

所以很自然地我不想直接去DriverManager并创建我自己的连接,我正在寻找某种EntityManager.executeArbitrarySQL(String)函数,它可以找到当前连接并使我的SQL成为当前事务的一部分.我是不是摇摇欲坠了?

Vin*_*lds 6

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

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

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

最后一个createNativeQuery(String sqlString)显然是用于没有返回结果集的场景,即执行INSERT,UPDATE和DELETE语句.

您还可以使用文件中的@NamedNativeQuery注释或named-native-query元素定义本机查询persistence.xml,但这些更适合于您在开发期间了解查询结构的情况.但是,您可以创建多个这样的命名本机查询来表示您要执行的所有SQL语句,然后根据用户输入在运行时执行不同的查询.使用这些EntityManager.createNamedQuery()方法执行带注释的本机查询.需要使用位置参数(使用?占位符定义)在运行时为本机查询提供值.