Querydsl web with contains



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

到目前为止,我使用的是querydsl和一个spring控制器,它只是委托给底层存储库:

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

这很有效。例如,我可以做:

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

其返回具有所有者CCD_ 1的所有文件夹。

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

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

其应当返回以CCD_ 2开头的所有文件夹。我不介意语法是否不同,只要我可以用"startsWith"谓词进行搜索。

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

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

感谢

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

@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 + "%"));
}
}

如@Alan Hay所述,添加一个自定义查询DSL绑定器,但覆盖自定义方法如下:

@Repository
public interface FolderRepository extends JpaRepository<Folder, Long>, 
QuerydslPredicateExecutor<Folder>, QuerydslBinderCustomizer<QFolder> {
@Override
default void customize(QuerydslBindings bindings, QFolder folder) {
bindings.bind(String.class).first((StringPath path, String value) -> 
path.startsWith(value));
}
}