EclipseLink JPA2 Criteria查询准备语句

时间:2012-12-01 10:57:27

标签: java persistence jpa-2.0 eclipselink

背景:我正在编写一个与现有SQL Server DB连接的小桌面应用程序。

我对编写SQL查询非常熟悉,但这次我想给JPA一个机会。我有我的实体映射,一切都很好,但我不担心性能。

我进行了一些分析,结果是JPA代码并不比手动映射慢。但是仍有一个问题困扰着我。

我已经使用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提供程序使用预准备语句?

1 个答案:

答案 0 :(得分:2)

默认情况下,EclipseLink不使用语句缓存。要启用一次,

“eclipselink.jdbc.cache语句”= “真”

这只能与EclipseLink的连接池一起使用。使用JavaEE DataSource时,需要在JavaEE服务器的DataSource配置中启用语句缓存。