我正在寻找最简单的方法(尽可能减少代码/自定义(来提供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));
}
}