gpt4 book ai didi

java - 如何在运行时为嵌套属性创建 CriteriaBuilder 表达式?

转载 作者:行者123 更新时间:2023-12-02 04:52:07 24 4
gpt4 key购买 nike

我正在尝试使用 Criteria API 创建一个用于深度过滤的通用方法。

例如,如果我想过滤属性“id.person.name”或超过 3 个嵌套属性。

我已经有 2 个嵌套属性的过滤器可以工作,例如:“person.name”。

下面的 elseif 条件适用于 3 个嵌套属性,但我正在尝试创建一个方法,如果出现新情况,我不需要更改该方法。

private <T> List<Predicate> filterInDepth(Map<String, String> params, Root<T> root,
CriteriaBuilder criteriaBuilder, String field, Class<T> clazz)
throws NoSuchFieldException {
List<Predicate> predicates = new ArrayList<>();
String[] compositeFields = field.split(REGEX_FIELD_SPLITTER);
if (compositeFields.length == 2) {
Join<Object, Object> join = root.join(compositeFields[0]);
predicates.add(criteriaBuilder.equal(join.get(compositeFields[1]),
params.get(field)));
}
else if (clazz.getDeclaredField(compositeFields[0]).getType()
.getDeclaredField(compositeFields[1]).getType()
.getDeclaredField(compositeFields[2]) != null) {
predicates.add(criteriaBuilder.equal(root.get(compositeFields[0])
.get(compositeFields[1]).get(compositeFields[2]), params.get(field)));
}
return predicates;
}

所以我试图分割字符串,循环并创建一个表达式。但我无法连接表达式。

最佳答案

我找到了一个解决方案,希望对某人有所帮助。

private <T> List<Predicate> filterInDepth(Map<String, String> params, Root<T> root,
CriteriaBuilder criteriaBuilder, String field, Class<T> clazz)
throws NoSuchFieldException {
List<Predicate> predicates = new ArrayList<>();
String[] compositeFields = field.split(REGEX_FIELD_SPLITTER);

if (isNestedFieldExists(clazz, compositeFields)) {
Path path = null;
for (String part : compositeFields) {
if (path == null) {
path = root.get(part);
}
else {
path = path.get(part);
}
}

predicates.add(criteriaBuilder.equal(path, params.get(field)));
}

return predicates;
}

private boolean isNestedFieldExists(Class clazz, String[] fieldChain)
throws NoSuchFieldException {
for (String field : fieldChain) {
Field f = clazz.getDeclaredField(field);
if (f.getType() == null) {
return false;
}

clazz = f.getType();
}

return true;
}

关于java - 如何在运行时为嵌套属性创建 CriteriaBuilder 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56429557/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com