gpt4 book ai didi

java - EclipseLink JPA2 Criteria 查询准备语句

转载 作者:行者123 更新时间:2023-11-30 04:35:20 29 4
gpt4 key购买 nike

背景:我正在编写一个连接到现有 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 提供程序使用准备好的语句?

最佳答案

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

“eclipselink.jdbc.cache-statements”=“true”

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

关于java - EclipseLink JPA2 Criteria 查询准备语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13658725/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com