循环中不区分大小写的isMember-JPA条件api

问题描述 投票:0回答:1

我创建了以下谓词来匹配给定的字符串集,例如包含@ElementCollection Set<String>的列的“ a,b,c”。我希望所有包含“ a”或“ b”或“ c”的条目。例如。所有这些条目/集合都匹配:

  • a //由于a
  • b,d //由于b
  • c,f,g //由于c

我有一个有效的谓词-我只需要使其不区分大小写(不想更改数据库):

private Predicate matchStringSet(Set<String> set, SetAttribute<DeliveryModeEntity, String> attribute,
        CriteriaBuilder criteriaBuilder, Root<DeliveryModeEntity> deliveryMode) {
        List<Predicate> matchEach = new ArrayList<>();
        for (String string : set) {
            matchEach.add(criteriaBuilder.isMember(string.toLowerCase(), deliveryMode.get(attribute)));

        }
        return criteriaBuilder.or(matchEach.toArray(new Predicate[] {}));

}

如何使deliveryMode.get(attribute)使用小写字母或如何不区分大小写。我尝试使用此处提到的联接:https://stackoverflow.com/a/10225074/447426但这在for循环中不起作用-它将为set中的每个字符串创建一个联接。

jpa criteria-api
1个回答
0
投票

我有一个类似的实体,Widget,带有标签:

@ElementCollection
@Column(name = "tag")
private List<String> tags = new ArrayList<>();

使用您拥有的,查找具有给定标签的所有小部件,请使用:

private Predicate matchTags(List<String> tags, Root<Widget> root, CriteriaBuilder cb) {
  List<Predicate> predicates = new ArrayList<>();

  for (String tag : tags) {
    predicates.add(cb.isMember(tag, root.get(Widget_.tags)));
  }
  return PredicateReducer.OR.reduce(cb, predicates); // cb.or(predicates.toArray(new Predicate[0]));
}

要以不区分大小写的方式查找所有具有给定标签的小部件,请先加入标签,然后执行类似的搜索:

private Predicate matchTagsCaseInsensitive(List<String> tags, Root<Widget> root, CriteriaBuilder cb) {
  List<Predicate> predicates = new ArrayList<>();
  Join<Widget, String> joinedTag = root.join(Widget_.tags);

  for (String tag : tags) {
    predicates.add(cb.like(cb.lower(joinedTag), tag.toLowerCase()));
  }
  return PredicateReducer.OR.reduce(cb, predicates); // cb.or(predicates.toArray(new Predicate[0]));
}
© www.soinside.com 2019 - 2024. All rights reserved.