2012-12-01 110 views
1

背景:我正在寫一個連接到現有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提供商使用預處理語句?

+0

他們使用準備好的語句。總是。你擔心他們不會重複使用他們之前創建的準備好的狀態嗎?別擔心。這不會讓您的應用變慢。 –

回答

2

默認情況下,EclipseLink不使用語句緩存。要啓用一個使用,

「eclipselink.jdbc.cache語句」 =「真」

這隻能用的EclipseLink的連接池使用。在使用JavaEE數據源時,需要在JavaEE服務器的DataSource配置中啓用語句高速緩存。