【问题标题】:Querydsl web with contains带有包含的Querydsl web
【发布时间】:2021-03-22 19:43:33
【问题描述】:

我正在寻找最简单的方法(尽可能少的代码/自定义)来提供 HTTP API 来从我的数据库中搜索对象。

到目前为止,我使用的是 querydsl,以及一个简单地委托给底层存储库的 spring 控制器:

@GetMapping("/folder")
@ResponseBody
public Iterable<Folder> getFolders(Predicate p) {
    return repo.findAll(p);
} 

这很好用。例如我可以这样做:

http://localhost/api/folder/owner=foo

返回所有拥有所有者foo的文件夹。

但是,我无法搜索给定关键字开头的字段。我希望能够做到这一点:

http://localhost/api/folder/name=foo*

应该返回所有以foo 开头的文件夹。只要我可以使用“startsWith”谓词进行搜索,我不介意语法是否不同。

我找到了这个库:https://bitbucket.org/gt_tech/spring-data-querydsl-value-operators/src/master/,它似乎提供了我需要的东西。

我有点担心我需要一个新的依赖项,它不是来自 spring 本身。它是最好的解决方案吗?如果是这样,如何使它与我的项目一起工作?我尝试添加maven依赖,但它不起作用,我需要做其他事情吗?

谢谢

【问题讨论】:

    标签: java spring spring-data querydsl


    【解决方案1】:

    您可以覆盖绑定以使用类似的表达式,如下所示:

    @Repository
    public interface FolderRepository extends JpaRepository<Folder, Long>, 
           QuerydslPredicateExecutor<Folder>, QuerydslBinderCustomizer<QFolder> {
    
        @Override
        default void customize(QuerydslBindings bindings, QFolder folder) {
            bindings.bind(folder.owner).first((path, value) -> 
                      path.likeIgnoreCase(value + "%"));
        }
    }
    

    【讨论】:

    • 谢谢。但是,这似乎很具体,如果我的对象中有 50 个字段怎么办。没有通用的方法来提供 startsWith 吗?而且我现在不能提供平等,对吧?
    • 我如果你想要那种功能然后使用正确的工具来完成这项工作,无论是你链接到的扩展、GraphQL 还是其他东西。
    • 那么关于我链接的工具,你能指导我如何使用它吗?正如我在最初的问题中所说,我尝试将其添加为依赖项,但这还不够
    • 你能帮我进一步吗?
    猜你喜欢
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-04
    • 2014-02-27
    • 2015-06-23
    • 1970-01-01
    • 2016-11-16
    相关资源
    最近更新 更多