当前位置: 首页 > 知识库问答 >
问题:

没有传递过滤器参数时的Spring Data QuerydslBinderCustomizer

阎涵容
2023-03-14

我正在实现一个存储库,该存储库实现了QuerydslBinderCustomizer,以帮助从url过滤器参数创建谓词。就是这样

@NoRepositoryBean
public interface TableRepository<T extends TableEntity, S extends EntityPathBase<T>> extends PagingAndSortingRepository<T, UUID>, QuerydslPredicateExecutor<T>, QuerydslBinderCustomizer<S> {
    @Override
    default void customize(@NonNull QuerydslBindings bindings, @NonNull S root) {
        bindings.bind(String.class).all((MultiValueBinding<StringPath, String>) (path, values) -> {
            BooleanBuilder predicate = new BooleanBuilder();
            values.forEach(value -> predicate.or(path.containsIgnoreCase(value)));
            return Optional.of(predicate);
        });
    }
}

我的个人实体存储库就是从这个扩展而来的,

public interface UserRepository extends TableRepository<User, QUser> {
}

这会产生一个endpoint http://localhost:port/users。一切正常,我可以发出请求,例如http://localhost:port/users?name=“somename”。

现在,我正在实现软删除,我不想在查询时返回软删除的记录。我正计划为此编辑< code>customize方法

default void customize(@NonNull QuerydslBindings bindings, @NonNull S root) {
        bindings.bind(String.class).all((MultiValueBinding<StringPath, String>) (path, values) -> {
            BooleanBuilder predicate = new BooleanBuilder();
            values.forEach(value -> predicate.or(path.containsIgnoreCase(value)));
            // If path does not have delete flag, add deleted=false to the predicate
            return Optional.of(predicate);
        });
    }

但是,当在没有任何参数的情况下调用endpoint时,即在处,就会出现问题http://localhost:port/users。在本例中为绑定。bind()被执行,但<code>BooleanBuilder谓词=new booleanboulder() 零件不可用。因此,我无法添加所需的谓词来过滤软删除的记录。如何进行?

我可能用错误的方式过滤删除的记录。还有更好的选择吗?

编辑:按照要求,我正在链接一个基本的库https://github.com/SayakMukhopadhyay/demo-querydsl

共有1个答案

微生曾琪
2023-03-14

所以我想你现在已经找到了解决方案。但对于那些试图获得某种“默认谓词”的人来说,这是一个潜在的解决方案。

就像你的情况一样,我们也有一个软删除,并希望默认排除它们,除非特别要求。

首先,您无法在自定义方法中设置此项。这些绑定仅在为条件传递值时触发。由于某些原因,他们没有在没有值时提供绑定。他们可能有充分的理由这样做。因此,在此方法中,您只关心通过的标准。

我们在请求中处理默认值的方式是在调用findAll之前修改谓词。

控制器签名应如下所示,并带有谓词:

@GetMapping
public ResponseEntity<List<User>> searchUsers(
            @QuerydslPredicate(root = User.class, bindings = UserRepository.class) Predicate predicate) 

您所需要做的就是检查谓词中是否有条件,如果没有,则自己添加它。

if (!ExpressionUtils.extract(predicate).toString().contains("deleted =")) {
    predicate = new StringPath("deleted").eq("false").and(predicate);
}
userRepository.findAll(predicate);

如果不存在,则应添加标准,如果存在,则忽略标准。

这显然是一个简化的表示,但想法是存在的。

希望这有所帮助。

 类似资料:
  • 问题内容: 这是我的config.json: 这是我的bash命令: 输出: 因此$ PRJNAME是prj1,但是第一次调用仅输出。 有人能帮我吗? 问题答案: 您的示例中的jq程序实际上会尝试查找名为的键。请尝试以下操作:

  • 问题内容: 是否可以将参数传递给filter函数,以便您可以按任何名称进行过滤? 就像是 问题答案: 实际上,还有另一种(也许是更好的解决方案),您可以使用angular的本机“过滤器”过滤器,并且仍将参数传递给自定义过滤器。 考虑以下代码: 要进行此工作,您只需将过滤器定义如下: 如您在这里看到的,weDontLike实际上返回另一个函数,该函数的范围内有您的参数以及来自过滤器的原始项。 我花了

  • 方法CheckReceivedFilesByParameters返回布尔值。如果为真,则下一条路由将成功启动。如何在false时调用route(direct:b)。我想用XML来实现这一点。我试图在标记外调用方法,但没有成功。 如何通过Exchange消息将参数正确地传递给MyBean方法。什么是最佳实践?现在我通过创建header,然后在我的方法中获得headerValues。我的XML中的示例

  • 问题内容: 我尝试过这个,并从JAVA中得到了奇怪的行为,有人可以帮我解释一下吗? 然后我有测试用例: 现在的问题是,如果我打电话直接与参数,我会回来,但如果调用与,它调用,它告诉我该参数不为空,但空数组。 问题答案: 问题是,如果我直接使用参数null调用testNull(),我会回来,但如果使用null调用callTestNull()调用了testNull(),它将告诉我参数不是null,而是

  • 所以我正在尝试使用、和发送一封电子邮件,并在邮件末尾添加一个取消订阅的可点击链接。这是我的方法 我可以成功发送电子邮件,但由于某种原因,在我的邮件正文中< code>unsubscribe没有显示为超链接,而是纯文本,在chrome浏览器的inspect元素中检查时,它显示如下< code >

  • 问题内容: 我有一个使用处理程序发布可运行实例的线程。它工作得很好,但是我很好奇我如何将参数传递给Runnable实例使用?也许我只是不了解此功能的工作原理。 为了避免出现“您为什么需要此问题”的问题,我有一个线程化的动画,必须调出UI线程来告诉它实际绘制的内容。 问题答案: 只需使用接受参数的构造函数实现的类就可以了, 您可以使用参数化构造函数创建Runnable类的实例。