【问题标题】:How can I tell JPA to use prepared statements (or dynamic sql)?如何告诉 JPA 使用准备好的语句(或动态 sql)?
【发布时间】:2017-01-25 07:02:09
【问题描述】:

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

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

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

【问题讨论】:

  • 提供者没有使用 PreparedStatement 的证据在哪里?
  • 我没有任何证据。我问这个问题是为了确保它使用准备好的语句来处理复杂、重复的查询。
  • 由于您的 JPA 提供程序是开源的,因此您可以检查代码库以“确保”。使用开源的(众多)优势之一。

标签: jpa jdbc openjpa


【解决方案1】:

我不确定如何告诉 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)

(credit OO7)

【讨论】:

    【解决方案2】:

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

    How to use PreparedStatement efficiently?

    【讨论】:

    • 很遗憾,这不是真的。 JSR-338 (JPA 2.1) 中没有任何地方说明查询或结果的preparationcaching,无论是否命名。这完全取决于提供者,通常会尽最大努力。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2014-07-11
    相关资源
    最近更新 更多