您能帮助我如何将下列代码转换为使用criteria builder的“in”运算符吗?我需要通过使用“in”的用户名列表/数组进行过滤。
我也尝试使用jpa criteriabuilder-“in”方法进行搜索,但没有找到好的结果。所以我真的很感激如果你能给我这个主题的参考网址。谢谢。
这是我的密码:
//usersList is a list of User that I need to put inside IN operator
CriteriaBuilder builder = getJpaTemplate().getEntityManagerFactory().getCriteriaBuilder();
CriteriaQuery<ScheduleRequest> criteria = builder.createQuery(ScheduleRequest.class);
Root<ScheduleRequest> scheduleRequest = criteria.from(ScheduleRequest.class);
criteria = criteria.select(scheduleRequest);
List<Predicate> params = new ArrayList<Predicate>();
List<ParameterExpression<String>> usersIdsParamList = new ArrayList<ParameterExpression<String>>();
for (int i = 0; i < usersList.size(); i++) {
ParameterExpression<String> usersIdsParam = builder.parameter(String.class);
params.add(builder.equal(scheduleRequest.get("createdBy"), usersIdsParam) );
usersIdsParamList.add(usersIdsParam);
}
criteria = criteria.where(params.toArray(new Predicate[0]));
TypedQuery<ScheduleRequest> query = getJpaTemplate().getEntityManagerFactory().createEntityManager().createQuery(criteria);
for (int i = 0; i < usersList.size(); i++) {
query.setParameter(usersIdsParamList.get(i), usersList.get(i).getUsername());
}
List<ScheduleRequest> scheduleRequestList = query.getResultList();
内部查询字符串被转换为以下内容,因此我不获取这两个用户创建的记录,因为它使用的是“and”。
select generatedAlias0 from ScheduleRequest as generatedAlias0 where ( generatedAlias0.createdBy=:param0 ) and ( generatedAlias0.createdBy=:param1 ) order by generatedAlias0.trackingId asc
2条答案
按热度按时间btqmn9zl1#
如果我理解的好,你想加入吗
ScheduleRequest
与User
并应用in
条款userName
实体的财产User
.我需要研究一下这个模式。但是您可以尝试使用这个技巧,它比您发布的代码可读性强得多,并且可以避免
Join
部分(因为它处理Join
条件查询之外的逻辑)。为了编写更多类型安全代码,您还可以通过替换此行来使用元模型:
有了这个:
如果有效,那么您可以尝试添加
Join
逻辑进入Criteria Query
. 但现在我无法测试,所以我更想看看是否有人想试试。bz4sfanl2#
虽然不是一个完美的答案,但代码片段可能会有所帮助。