2017-01-25 10 views
0

Я понимаю преимущества подготовленных данных над динамическим sql, как описано в Difference between Statement and PreparedStatement.Как я могу сказать JPA использовать подготовленные заявления (или динамический sql)?

Однако я не уверен, как сообщить JPA (не) использовать подготовленное заявление.

У меня есть несколько именованных запросов. Является ли JPA автоматически, используя подготовленные данные для этого? Что относительно критериев API. Я предполагаю, что он использует динамический sql?

+0

Где ваши доказательства, что провайдер не использует PreparedStatement? –

+0

У меня нет никаких доказательств. Я задаю этот вопрос, чтобы убедиться, что он использует подготовленные операторы для сложных, повторяющихся запросов. – BetaRide

+0

, так как ваш поставщик JPA является открытым исходным кодом, вы можете проверить кодовую базу на «make sure». Одно из (многих) преимуществ использования открытого источника. –

ответ

1

Я согласен с Мишель в том, что, как правиле подготовленных заявления используются нижележащим поставщик JPA/реализатор. Для того, чтобы гарантировать, что ваши заявления подготавливаются и кэшируются результаты (если вы хотите этого), используя стандартный JPA см мой ответ здесь:

How to use PreparedStatement efficiently?

+0

К сожалению, ** это неправда **. Нигде в JSR-338 (JPA 2.1) не указано о * подготовке * или * кешировании * запросов или результатов, независимо от того, указаны они или нет. Все зависит от поставщика, который * обычно * прилагает все усилия. –

2

Я не уверен, как сообщить JPA (не) использовать подготовленное заявление.

Вы не можете. Это зависит от поставщика, которого вы используете, и если/как он предоставляет такую ​​конфигурацию.

Является ли JPA автоматически использующим подготовленные данные для этого?

Любой достойный поставщик будет использовать подготовленные данные.

Что относительно критериев API. Я предполагаю, что он использует динамический sql?

То же, что и выше. В примере, Hibernate использует подготовленный statments даже с носителями запросов:

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)

 Смежные вопросы

  • Нет связанных вопросов^_^