hibernate - JPA CriteriaBuilder - 如何使用 "IN"比较运算符

标签 hibernate jpa orm jpa-2.0 criteria-api

您能帮我如何将以下代码转换为使用条件生成器的“in”运算符吗? 我需要使用“in”使用用户名列表/数组进行过滤。

我也尝试使用 JPA CriteriaBuilder -“in”方法进行搜索,但找不到好的结果。 因此,如果您能给我该主题的引用 URL,我将不胜感激。谢谢。

这是我的代码:

//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 

最佳答案

如果我理解得很好,您希望将 ScheduleRequestUser 一起加入,并将 in 子句应用于 userName > 实体User的属性。

我需要在这个模式上做一些工作。但是您可以尝试使用这个技巧,这比您发布的代码更具可读性,并且避免了 Join 部分(因为它处理 Criteria Query 之外的 Join 逻辑) .

List<String> myList = new ArrayList<String> ();
for (User u : usersList) {
    myList.add(u.getUsername());
}
Expression<String> exp = scheduleRequest.get("createdBy");
Predicate predicate = exp.in(myList);
criteria.where(predicate);

为了编写更多类型安全的代码,您还可以通过替换此行来使用 Metamodel:

Expression<String> exp = scheduleRequest.get("createdBy");

这样:

Expression<String> exp = scheduleRequest.get(ScheduleRequest_.createdBy);

如果有效,那么您可以尝试将Join 逻辑添加到Criteria Query 中。但现在我无法测试它,所以我更愿意看看其他人是否愿意尝试。

关于hibernate - JPA CriteriaBuilder - 如何使用 "IN"比较运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9321916/

相关文章:

java - 在hibernate spring jsf和primefaces的集成中将primefaces数据表编辑到数据库后保存数据

java - 错误请求 400

java - JPA/Hibernate在获取数据时非常慢

java - JPA/hibernate java.lang.NoSuchMethodError

python - 向后与 Django 中的代理模型建立多对多关系

实现类的Java Null点异常?

hibernate - 使用@Where 子句映射@OneToOne

java - 是否可以映射(JPA)在抽象父类(super class)中使用泛型的 Java 类型层次结构?

java - 如何通过@IndexColumn 中的数字选择集合中的第 n 个元素?

python - Django ORM - 如何使用values().annotate().values()执行复杂的GROUP BY