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

JPA CriteriaBuilder将合并条件合并为析取条件

赫连捷
2023-03-14
问题内容

我需要将此查询复制到 JPA CriteriaBuilder 代码中:

....
where
     article.client_id = 1 
     and article.price > 0
     and (
           article.code like '%this is statement%' 
           or article.oem_code like '%this is statement%'
           or ( 
               article.description like '%this%'
               and article.description like '%is%'
               and article.description like '%statement%'
           )    
     )

这是我的代码:

...

Root<Article> article = cq.from(Article.class);

List<Predicate> predicates = new ArrayList<Predicate>();

predicates.add(cb.equal(article.get(Article_.clientId), filter.getClientId()));

predicates.add(cb.greaterThan(article.get(Article_.price), BigDecimal.ZERO));

String searchQuery = filter.getSearchQuery();

Predicate disjunction = cb.disjunction();

disjunction.getExpressions().add(cb.like(article.get(Article_.code), "%" + searchQuery + "%"));
disjunction.getExpressions().add(cb.like(article.get(Article_.oem_code), "%" + searchQuery + "%"));

List<Predicate> andPredicate = new ArrayList<Predicate>();

for (String str : searchQuery.split(" ")) {
   andPredicate.add(cb.like(article.get(Article_.description), "%" + str + "%"));    
}

现在,如何将其添加andPredicate到析取谓词中?在getExpressions().add(...)不采取Predicate为PARAM。

谢谢


问题答案:

所以这就是我所做的,并且看起来工作正常:

...  
Predicate pr1 = cb.like(article.get(Article_.code), "%" + searchQuery + "%");
Predicate pr2 = cb.like(article.get(Article_.oem_code), "%" + searchQuery + "%");
Predicate pr3 = cb.conjunction();

for (String str : busquedaSplit) {
    Predicate newPredicate = cb.like(article.get(Article_.description), "%" + str + "%");
    pr3 = cb.and(pr3, newPredicate);
}

disjunction = cb.or(pr1, pr2, pr3);

predicates.add(disjunction);


 类似资料:
  • 此代码不断要求用户提供双精度值,直到用户输入空行。当用户输入非双精度值(如字符串)时,将显示“无效输入”消息。目前,即使用户输入空行,也会显示无效的输入消息,我理解原因。当我输入空行时,获得无效输入不显示的最佳方法是什么。我不确定是否有办法使用try-catch,或者我只需要使用其他东西。

  • 我有一个有许多记录的表。它有以下结构: 表(col1、col2、col3、col4、col5、col6): 还有很多很多其他的行。 因此,我想要一张桌子: 表(col1,col2,col3,col4_1,col4_2,col4_3,col5_1,col5_2,col5_3,col6_1,col6_2,col6_3): 换句话说:表中的某些部分具有相同的,但不同的。每个相同的行数在1-3之间变化(事

  • 问题内容: 我的文件夹上有多个csv文件。列标题不同,但列数据相同。 括号内的数字是实际的列名。项目(67)67是列名 因此,忽略字符串Item,仅考虑int()中的int并执行操作。 样本文件:https : //drive.google.com/open?id=1q7c1AqCRKRufSVh– 9o0W6rdz28QyBGa 说明: 驱动器上的文件应附加在一起。基于列名称的“启用条件”。如果

  • 问题内容: 我完全相信我的问题很简单,但我无法使用流进行处理(如果有一种方法也可以不使用流进行处理,那么它也会有所帮助)假设我们有此用户列表 并假设我们的List 中包含以下数据 在此预期的结果它因为名字,姓氏和类型列表中出现了两次只是合并是常见的结果,而不会错过任何领域的 预期成果 问题答案: 您可以创建一个包含三个字段的键类,例如 分组 这些可以用来对您的用户进行分组 这些列表中的每一个都可以

  • 假设我有2个数据帧: DF1: Col1 | Col2 | Col3 XCN000370/17-18C|XCN0003711718C|0003971718 DF2 Col1 | Col2 | Col3 XCN0003711718C|XCN0003711718C|0003971718 我希望它们像这样合并: 首次匹配Col1(DF1)和Col1(DF2) 在保持不匹配的情况下,将Col1(DF1)与

  • 我正在使用下面的XSLT- 可以有人请检查XSLT代码,帮助我得到想要的结果。当前,我得到以下错误数组([type]=>2[message]=>XSLTProcessor::TransformToxML():没有与此对象关联的样式表[file]=>/var/www/html/online-toolz.com/functions/xslt.php[line]=>26)错误:XSLTProcessor