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

时间:2017-01-25 07:02:10

标签: jpa jdbc openjpa

我确实了解准备好的状态优于动态sql的优点,如Difference between Statement and PreparedStatement中所述。

但我不知道如何告诉JPA(不)使用预先准备好的陈述。

我有很多命名的查询。 JPA会自动使用准备好的声明吗?标准API怎么样?我的猜测是它使用的是动态sql?

2 个答案:

答案 0 :(得分:2)

  

我不知道如何告诉JPA(不)使用准备好的声明。

你做不到。这取决于您使用的提供程序以及它是否/如何公开此类配置。

  

JPA会自动使用准备好的声明吗?

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

  

标准API怎么样?我的猜测是它使用的是动态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)

screenshot

答案 1 :(得分:1)

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

How to use PreparedStatement efficiently?