Java EclipseLink JPA2条件查询准备语句

Java EclipseLink JPA2条件查询准备语句,java,persistence,jpa-2.0,eclipselink,Java,Persistence,Jpa 2.0,Eclipselink,背景:我正在编写一个连接到现有SQLServerDB的小型桌面应用程序 我非常熟悉编写SQL查询,但这次我想尝试一下JPA。我有我的实体映射,一切都很好,但我不担心性能 我做了一些分析,结果是JPA代码并不比手工映射慢。但还有一个问题困扰着我 我已经用SQLServerProfiler记录了查询,Eclipse链接不断地使用相同的查询但参数不同调用exec sp_prepexec和exec sp_unprepare 我已经重写了在查询中使用参数的代码,但仍然没有成功 课程代码为: 在构造函数中,

背景:我正在编写一个连接到现有SQLServerDB的小型桌面应用程序

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

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

我已经用SQLServerProfiler记录了查询,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;

因此,我的问题是如何使EclipseLink或其他JPA2提供程序使用准备好的语句?

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

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


这只能用于EclipseLink的连接池。使用JavaEE数据源时,您需要在JavaEE服务器的数据源配置中启用语句缓存。

它们确实使用准备好的语句。总是。你是否担心他们不会重复使用他们以前制作的一种准备好的糖浆?别担心。这并不是让你的应用程序变慢的原因。
    query.getResultList();