当前位置: 首页 > 面试题库 >

JPA CriteriaBuilder-如何使用“ IN”比较运算符

慕乐语
2023-03-14
问题内容

您能帮我如何将以下代码转换为使用条件生成器的“ 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部分(因为它处理Join了Criteria
Query之外的逻辑)。

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);

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

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

有了这个:

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

如果可行,则可以尝试将Join逻辑添加到中Criteria Query。但是现在我无法对其进行测试,因此我更愿意看看其他人是否想要尝试。



 类似资料:
  • 我有一个将unitPrice设置为BigDecimal数据类型的域类。现在我正在尝试创建一种比较价格的方法,但似乎我不能在BigDecimal数据类型中使用比较运算符。我必须更改数据类型还是有其他方法?

  • < > <= >= == ~= 分别表示 小于,大于,不大于,不小于,相等,不相等 所有这些操作符总是返回 true 或 false。 对于 Table,Function 和 Userdata 类型的数据,只有 == 和 ~=可以用。相等表示两个变量引用的是同一个数据。比如: a={1,2} b=a print(a==b, a~=b) -- true, false a={1,2} b={1,2}

  • 问题内容: 稍微打错一下就遇到了这个问题(在Python 2.7.5中): 当它,我不小心爆炸了月亮。 我的理解是相当于和表现良好的类(如内置函数),相当于。 如果没有或运算符,那么我认为Python使用。 但是,这些方法都与工作对象,而与运营商 做 的工作。发生这种情况的原因是什么? 问题答案: 但是,当<和>运算符起作用时,这些方法都不能与函数对象一起起作用。发生这种情况的原因是什么? 在任何

  • 概述 比较运算符用于比较两个值的大小,然后返回一个布尔值,表示是否满足指定的条件。 2 > 1 // true 上面代码比较2是否大于1,返回true。 注意,比较运算符可以比较各种类型的值,不仅仅是数值。 JavaScript 一共提供了8个比较运算符。 > 大于运算符 < 小于运算符 <= 小于或等于运算符 >= 大于或等于运算符 == 相等运算符 === 严格相等运算符 != 不相等运算符

  • 本文向大家介绍Elixir比较运算符,包括了Elixir比较运算符的使用技巧和注意事项,需要的朋友参考一下 示例 平等: 价值平等x == y(1 == 1.0 # true) 价值不平等x == y(1 != 1.0 # false) 严格平等x === y(1 === 1.0 # false) 严格不等式x === y(1 !== 1.0 # true) 比较: x > y x >= y x

  • MongoDB比较运算符用于测试等于或不等于,还有其它更高级的运算符。 在子句中使用比较运算符来确定要选择的记录。以下是可以在MariaDB中使用的比较运算符的列表: 语法及示例 - 编号 比较运算符 描述 示例 1 比较等于 2 比较等于(安全比较值) 3 比较不等于 4 比较不等于 5 比较大于 6 比较大于或等于 7 比较小于 8 比较小于或等于 9 匹配列表中的值 10 否定一个条件 11