gpt4 book ai didi

java - JPA标准API : Iterate through list and create predicates

转载 作者:行者123 更新时间:2023-11-30 01:56:17 24 4
gpt4 key购买 nike


我正在尝试使用 Spring boot、Spring data JPA 和 Hibernate 将 iBatis 项目迁移到休息服务中。我陷入查询转换,非常感谢任何帮助。这是我尝试迁移的 iBatis 查询。

<foreach item="item" collection="currentStatus">
<choose>
<when test="item in fStatusList">
((j_status_code != #{item}) AND (f_status_code = #{item}) AND
(EXP_FLAG IS NULL OR EXP_FLAG ='F' ))
</when>
<when test="item in jStatusList">
((max_jsc.status_code = #{item}) AND
<if test="item ==419">
EXP_FLAG='H'
</if>
<if test="item ==449">
EXP_FLAG='C'
</if>
</when>
<otherwise>
((j_status_code = #{item}) AND (f_status_code_name is null))
</otherwise>
</choose>
</foreach>

这就是我到目前为止所拥有的。

    CriteriaBuilder cb = entityManager.getCriteriaBuilder();
CriteriaQuery<Job> cq = cb.createQuery(Job.class);
Root<Job> job = cq.from(Job.class);
List<Predicate> predicates = new ArrayList<>();
for (int status : statusList) {
if (IntStream.of(fStatusList()).anyMatch(x -> x == status)) {
predicates.add(cb.equal(job.get("f_status_code"), status));
predicates.add(
cb.or(
cb.isNull(job.get("EXP_FLAG")),
cb.equal(
job.get("EXP_FLAG"),"F")));
} else if (IntStream.of(jStatusList()).anyMatch(x -> x == status)) {
predicates.add(cb.equal(job.get("jobStatusCode"), status));
if (status == 10) {
predicates.add(
cb.equal(
job.get("EXP_FLAG"), "H"));
} else if (status == 15) {
predicates.add(
cb.equal(
job.get("EXP_FLAG"), "C"));
}
} else {
predicates.add(
cb.and(
cb.isNull(job.get("f_status_code")),
cb.equal(job.get("j_status_code"), status)));
}
}
cq.where(predicates.toArray(new Predicate[0]));
TypedQuery<Job> query = entityManager.createQuery(cq);

问题在于 where 条件的形成如下所示。迭代需要为每个状态添加 OR 条件,而不是 AND。我怎样才能实现这一目标?

where
(
job0_.f_status_code is null
)
and job0_.j_status_code=315
and job0_.j_status_code=449
and job0_.exp_flag=?

另请告知使用 JPA Criteria API 是否是这些场景中的最佳选择。对于一些简单的 iBatis 条件来说,它看起来相当复杂且难以阅读。使用 Hibernate 时有更好的选择吗?

最佳答案

CriteriaQuery#where()当传递谓词数组时创建一个连词,即它在它们之间使用 and 运算符。如果您想使用析取,即 or 运算符,只需将它们用 CriteriaBuilder#or() 包裹起来即可。 :

cq.where(cb.or(predicates.toArray(new Predicate[] {})));

关于您的第二个问题,请考虑 Hibernate Criteria 已被弃用,取而代之的是 JPA Criteria API:Deprecated createCriteria method in Hibernate 5

关于java - JPA标准API : Iterate through list and create predicates,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54415742/

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