背景: 既存の SQL Server DB に接続する小さなデスクトップ アプリケーションを作成しています。
私は SQL クエリの作成に精通していますが、今回は JPA を試してみたいと思います。私は自分のエンティティをマッピングしており、すべて問題ありませんが、パフォーマンスについてはほとんど心配していません。
プロファイリングを行った結果、JPA コードは手動でマッピングするよりもそれほど遅くはありません。しかし、私を悩ませている問題がまだ 1 つあります。
SQL Server Profiler でクエリを記録しました。Eclipse リンクは、同じクエリで異なるパラメータを使用して exec sp_prepexec と exec sp_unprepare を常に呼び出しています。
クエリでパラメーターを使用するようにコードを書き直しましたが、まだうまくいきません。
クラスコードは次のとおりです。
コンストラクターで EntityManagerFactory と EntityManager を作成します
emf = Persistence.createEntityManagerFactory("ZapytaniaOKonta_1.0");
em = emf.createEntityManager();
query=prepareQuery();
prepareQuery では、基準ビルダーとパラメーターを使用してクエリを準備します
CriteriaBuilder builder = em.getCriteriaBuilder();
CriteriaQuery<Uczestnik> criteria = builder.createQuery(Uczestnik.class);
Root<Uczestnik> uczestnikRoot = criteria.from(Uczestnik.class);
criteria.select(uczestnikRoot);
ParameterExpression<Boolean> peselFilterParameter = builder.parameter(Boolean.class, "peselFilterParameter");
ParameterExpression<String> peselParameter = builder.parameter(String.class, "peselParameter");
Predicate peselPredicate = orBuilder(builder, uczestnikRoot, peselParameter, peselFilterParameter, Uczestnik_.pesel);
ParameterExpression<Boolean> nipFilterParameter = builder.parameter(Boolean.class, "nipFilterParameter");
ParameterExpression<String> nipParameter = builder.parameter(String.class, "nipParameter");
Predicate nipPredicate = orBuilderNip(builder, uczestnikRoot, nipParameter, nipFilterParameter, Uczestnik_.nip);
ParameterExpression<Boolean> regonFilterParameter = builder.parameter(Boolean.class, "regonFilterParameter");
ParameterExpression<String> regonParameter = builder.parameter(String.class, "regonParameter");
Predicate regonPredicate = orBuilder(builder, uczestnikRoot, regonParameter, regonFilterParameter, Uczestnik_.regon);
criteria.where(builder.and(peselPredicate, nipPredicate, regonPredicate));
uczestnikPeselRegonNipQuery = em.createQuery(criteria);
return uczestnikPeselRegonNipQuery;
クエリを使用するときは、すべてのパラメーターを設定して呼び出します
query.getResultList();
私の質問は、EclipseLinkまたは他のJPA2プロバイダーに準備済みステートメントを使用させるにはどうすればよいですか?