Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
循环中不区分大小写的isMember-JPA标准api_Jpa_Criteria Api - Fatal编程技术网

循环中不区分大小写的isMember-JPA标准api

循环中不区分大小写的isMember-JPA标准api,jpa,criteria-api,Jpa,Criteria Api,我创建了以下谓词,它将一组给定的字符串(例如“a,b,c”)与包含@ElementCollection集的列相匹配。 我想要所有包含“a”或“b”或“c”的条目。例如,所有这些条目/集合匹配: a//因为 b,d//因为b c,f,g//因为c 我有一个谓词正在工作-我只需要使其不区分大小写(不想更改数据库): 私有谓词matchStringSet(集合集合、集合属性、, CriteriaBuilder(CriteriaBuilder,根交付模式){ List matchEach=new A

我创建了以下谓词,它将一组给定的字符串(例如“a,b,c”)与包含
@ElementCollection集的列相匹配。
我想要所有包含“a”或“b”或“c”的条目。例如,所有这些条目/集合匹配:

  • a
    //因为
  • b,d
    //因为b
  • c,f,g
    //因为c
我有一个谓词正在工作-我只需要使其不区分大小写(不想更改数据库):

私有谓词matchStringSet(集合集合、集合属性、,
CriteriaBuilder(CriteriaBuilder,根交付模式){
List matchEach=new ArrayList();
for(字符串:设置){
matchEach.add(criteriaBuilder.isMember(string.toLowerCase(),deliveryMode.get(属性));
}
返回criteriaBuilder.or(matchEach.toArray(新谓词[]{}));
}
如何使
deliveryMode.get(属性)
使用小写或如何使此不区分大小写。 我尝试使用此处提到的联接:
但这在for循环中不起作用-它将为集合中的每个字符串创建一个联接。

我有一个类似的实体,
Widget
,具有标记:

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

我有一个类似的实体,
Widget
,具有标记:

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

出于好奇:什么是PredicateReducer?编辑为包含
PredicateReducer
enum。希望有用!出于好奇:什么是PredicateReducer?编辑为包含
PredicateReducer
enum。希望有用!
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]));
}
public enum PredicateReducer {
  AND {
    @Override
    public Predicate reduce(CriteriaBuilder cb, List<Predicate> predicates) {
      return cb.and(predicates.toArray(new Predicate[0]));
    }
  },
  OR {
    @Override
    public Predicate reduce(CriteriaBuilder cb, List<Predicate> predicates) {
      return cb.or(predicates.toArray(new Predicate[0]));
    }
  };

  public abstract Predicate reduce(CriteriaBuilder cb, List<Predicate> predicates);

  public Predicate reduce(CriteriaBuilder cb, Predicate... predicates) {
    return reduce(cb, Arrays.asList(predicates));
  }
}