我确实了解准备好的状态优于动态sql的优点,如Difference between Statement and PreparedStatement中所述。
但我不知道如何告诉JPA(不)使用预先准备好的陈述。
我有很多命名的查询。 JPA会自动使用准备好的声明吗?标准API怎么样?我的猜测是它使用的是动态sql?
答案 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)
答案 1 :(得分:1)
我同意Michele的观点,通常准备好的语句由底层JPA提供者/实现者使用。为确保您的陈述准备好并使用标准JPA缓存结果(如果您需要),请在此处查看我的回复: