#java #spring #spring-data #querydsl
#java #весна #весна-данные #querydsl
Вопрос:
Я ищу самый простой способ (с наименьшим количеством кода / настроек, насколько это возможно) предоставить 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, но она не работает, нужно ли мне делать что-то еще?
Спасибо
Ответ №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 "%"));
}
}
Комментарии:
1. Спасибо. Однако это кажется очень специфичным, что, если у меня есть 50 полей в моем объекте. Нет ли общего способа предоставить StartsWith ? И я не могу предоставить equals сейчас, верно?
2. Если вам нужна такая функциональность, тогда используйте правильный инструмент для работы, будь то расширение, с которым вы связались, GraphQL или что-то еще.
3. Или baeldung.com/rest-api-search-language-rsql-fiql
4. Итак, что касается инструмента, на который я ссылался, не могли бы вы рассказать мне, как его использовать? Как я уже говорил в своем первоначальном вопросе, я попытался добавить его как зависимость, но этого недостаточно
5. Вам удалось это выяснить? Я смог заставить библиотеку операторов значений работать со строками и числами, но испытываю трудности с классами java 8 datetime.