gpt4 book ai didi

java - Spring Data 规范 - 带 join 的 RSQL

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

我正在尝试使用规范和 RSQL 开发搜索 API。遵循本教程 - https://www.baeldung.com/rest-api-search-language-rsql-fiql

我有一个与 UserProfile 具有 OneToOne 关系的 User 实体。

@Entity
public class User{

@Column(nullable = false)
private String firstName;

@OneToOne(targetEntity = UserProfile.class, fetch = FetchType.EAGER)
@JoinColumn(nullable = false, name = "user_profile_id")
private UserProfile userProfile;
...

@Entity
public class UserProfile{

@Column(nullable = false)
private String education;

...

和谓词函数,

@Override
public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder builder) {
List<Object> args = castArguments(root);
Object argument = args.get(0);

switch (RsqlSearchOperation.getSimpleOperator(operator)) {

case EQUAL: {
if (argument instanceof String) {
return builder.like(root.get(property), argument.toString().replace('*', '%'));
} else if (argument == null) {
return builder.isNull(root.get(property));
} else {
return builder.equal(root.get(property), argument);
}
}
case NOT_EQUAL: {

...

当我使用参数 ?search=firstName==John 调用 API 时,它按预期返回结果。我需要的是按教育程度搜索并返回具有该教育程度的用户。我尝试按如下方式加入,但它不起作用。

if (argument instanceof String) {
Join<User, UserProfile> profileJoin = root.join("user_profile_id");

return builder.like(root.get(property), profileJoin.get(property));
} else if (argument == null) {

任何具有通用性的解决方案都会非常有帮助。

最佳答案

看起来泛型没有具体的解决方案。所以我这样做了,这几乎是通用的。

switch (RsqlSearchOperation.getSimpleOperator(operator)) {

case EQUAL: {
if (doesClassContainProperty(UserProfile.class, property)) {
Join<User, UserProfile> profileJoin = root.join("user_profile_id");
return builder.equal(profileJoin.get(property), argument);
} else {
return builder.equal(root.get(property), argument);
}
}

这里是检查传递的参数是否在根类或加入类中的方法

public boolean doesClassContainProperty(Class<?> genericClass, String fieldName) {
return Arrays.stream(genericClass.getDeclaredFields()).anyMatch(f -> f.getName().equals(fieldName));
}

关于java - Spring Data 规范 - 带 join 的 RSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57100185/

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