【问题标题】:EclipseLink JPA2 Criteria Query preparing statementEclipseLink JPA2 Criteria Query 准备语句
【发布时间】:2012-12-01 10:57:26
【问题描述】:

背景:我正在编写一个连接到现有 SQL Server 数据库的小型桌面应用程序。

我对编写 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 提供者使用准备好的语句?

【问题讨论】:

  • 他们确实使用准备好的语句。总是。您是否担心他们不重用他们之前创建的准备好的状态?别担心。这不会让您的应用变慢。

标签: java persistence jpa-2.0 eclipselink


【解决方案1】:

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

"eclipselink.jdbc.cache-statements"="true"

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-07
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多