我如何告诉 JPA 使用准备好的语句(或动态 sql)?

How can I tell JPA to use prepared statements (or dynamic sql)?

我确实理解准备好的语句相对于动态 sql 的优势,如 Difference between Statement and PreparedStatement 中所述。

但是我不确定如何告诉 JPA(不)使用准备好的语句。

我有很多命名查询。 JPA 是否为此自动使用准备好的语句?标准 API 呢?我的猜测是它使用的是动态 sql?

I'm not sure how to tell JPA to (not) use a prepared statement.

你不能。这取决于您使用的提供商,if/how 它公开了这种配置。

Is JPA automatically using prepared statments for this?

任何体面的提供者都会使用准备好的语句。

What about criteria API. My guess is that it's using dynamic sql?

同上。例如,Hibernate 甚至在本地查询中也使用准备好的语句:

at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.doList(Loader.java:2220)

(credit OO7)

我同意 Michele 的观点,通常 底层 JPA provider/implementer 使用准备好的语句。为确保使用标准 JPA 准备您的语句并缓存结果(如果您需要),请在此处查看我的回复: