java - 使用未知对象结构的 Criteria Root 元素遍历路径
问题描述
我有一个搜索 API,可以抽象地搜索在持久性方案中定义的引用实体的属性。例如,我有类似这些实体的东西:
@Entity
public class EntityA {
@Column
private String someProperty;
@Column
private EntityB someReference;
}
@Entity
public class EntityB {
@Column
private String someProperty;
@Column
private Set<EntityC> someReferences;
}
@Entity
public class EntityC {
@Column
private String someProperty;
}
使用这些实体,我可以遍历路径(例如,当我的根是 EntityA 并且我确定用户在其中搜索字符串字段时:
private Expression<String> getExpression(Root<T> root, String fieldName) {
String[] propertySplit = fieldName.split("\\.");
Path<String> path = null;
for (String property : propertySplit) {
if (path == null) {
path = root.get(property);
continue;
}
path = path.get(property);
}
return path;
}
假设当前是 EntityA,我可以像这样调用 getExpression 方法:
[...]
criteriaBuilder.equal(getExpression(entityARoot, "someProperty"), "myValue");
[...]
我也可以调用引用:
[...]
criteriaBuilder.equal(getExpression(entityARoot, "someReference.someProperty"), "myValue");
[...]
但是当路径遇到集合类型时,这不起作用,但我想做这样的事情:
[...]
criteriaBuilder.equal(getExpression(entityARoot, "someReference.someReferences.someProperty"), "myValue");
[...]
我收到以下异常:
java.lang.IllegalStateException: Illegal attempt to dereference path source [null.someReferences] of basic type
我知道必须有一种方法来归档它,因为 Spring Data 也可以使用存储库中的方法名称来做到这一点。我的目标是创建一个可以遍历任何未知对象的函数,只要我检查的最终属性是我知道的类型。所以我每次都知道标准是否应该比较字符串、整数、布尔值、日期等。
解决方案
我偶然发现了一个我认为是您正在寻找的实现。查看此项目的代码github.com/perplexhub/rsql-jpa-specification/ ... /RSQLJPAPredicateConverter.java#L49-L130。
我将此项目标记为可以导入现有项目的内容,以启用您在问题中描述的通用处理。我当前的实现是针对所有已知的输入谓词进行硬编码的。
推荐阅读
- java - 更改 Liquibase - 找不到数据库驱动程序:com.mysql.cj.jdbc.Driver
- powerbi - Power BI:需要计算最近 3 个月的 MTD 销售额
- django - 如何更新主键,外键指向什么,没有“ON UPDATE CASCADE”
- reactjs - Formik 不会将值更新为 IonSelect 标签
- flutter - 将颤振代码迁移到空安全后,模拟对象不接受“任何”
- c# - c# sonarlint中的NameValueCollection
- c# - Vector256.Create 和 Avx2.BroadcastScalarToVector 函数有什么区别?
- javascript - 调整容器大小时的 Masonry + ScrollReveal 错误
- javascript - JS:从 numpy 数组显示图像
- javascript - 防止在 JavaScript 中拦截 XHR 请求