2017-01-25 10 views
0

私はDifference between Statement and PreparedStatementで説明されているように、動的SQLよりも準備済みの文章の利点を理解しています。JPAにプリペアドステートメント(または動的SQL)を使用するように指示するにはどうすればよいですか?

しかし私は、準備されたステートメントをJPAに(使用しない)ように指示する方法がわかりません。

私は多くの名前付きクエリを持っています。 JPAはこれに対して準備された文章を自動的に使用していますか?基準APIはどうですか?私の推測では、動的SQLを使用しているということですか?

+0

を? –

+0

私は全く証拠がありません。私は複雑な、繰り返しクエリのために準備されたステートメントを使用していることを確認するこの質問をしています。 – BetaRide

+0

JPAプロバイダがオープンソースであるため、コードベースで「確かめる」ことができます。オープンソースを使用した(多くの)利点の1つ。 –

答えて

1

Iは、基礎となるJPAプロバイダ/実装によって使用される一般準備文にミシェルに同意します。標準JPAを使用して(あなたがこれを望む必要があります)あなたの文が用意されているとの結果がキャッシュされていることを保証するためにここに私の応答を参照してください:プロバイダがPreparedStatementをあなたの証拠使用していないされていることを

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

関連する問題