背景:我正在寫一個連接到現有SQL Server數據庫的小桌面應用程序。EclipseLink JPA2條件查詢準備語句
我很熟悉編寫SQL查詢,但這次我想給JPA了一槍。我有我的實體映射,一切都很好,但我有點擔心perfomance。
我做了一些分析,其結果是,JPA代碼是不是真的比手繪圖速度較慢。但仍有一個問題困擾着我。
我錄與SQL Server探查和Eclipse的鏈接不斷調用exec sp_prepexec和exec sp_unprepare用相同的查詢,但diffent參數查詢。
我rewriten在查詢中使用參數的代碼,但仍沒有運氣。
類代碼是:
在構造函數創建的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提供商使用預處理語句?
他們使用準備好的語句。總是。你擔心他們不會重複使用他們之前創建的準備好的狀態嗎?別擔心。這不會讓您的應用變慢。 –