Создайте пользовательский поисковик с помощью spring repository
-
21-12-2019 - |
Вопрос
Я использую Spring Roo со слоями репозитория.У меня есть два занятия:Документ (с названием документа) и заполненный документ (содержащий соответствующий документ).Подобный этому:
public class Document {
/**
*/
@NotNull
private String titleDocument;
...
}
public class FilledDocument {
/**
*/
@OneToOne
private Document relatedDocument;
...
}
Я бы хотел создать finder для класса FilledDocument, который соответствует заголовку внутри атрибута relatedDocument.
Я использую решение, которое не является элегантным и эффективным.В моем контроллере у меня есть:
@RequestMapping(params = "find", produces = "text/html")
public String findFilledDocumentsByTitleDocumentContaining(@RequestParam(value = "title", required = true) String title, Model uiModel) {
LinkedList<FilledDocument> allFilledDocuments = new LinkedList<FilledDocument>();
allFilledDocuments.addAll(filledDocumentService.findAllFilledDocuments());
ArrayList<FilledDocument> filledDocuments=new ArrayList<FilledDocument>();
for( FilledDocument filledDocument : allFilledDocuments ) {
if( filledDocument.getRelatedDocument().getTitleDocument().toLowerCase().contains(title.toLowerCase()) == true ) {
filledDocuments.add(filledDocument);
}
}
uiModel.addAttribute("filleddocuments", filledDocuments);
return "filleddocuments/list";
}
Я читаю это Spring Data JPA - Справочная документация и я пытаюсь с помощью @Query в классе repository, вот так:
@Query("select f from FilledDocument f where f.relatedDocument.titleDocument containing = ?1")
public ArrayList<FilledDocument> findFilledDocumentByTitleDocument(@Param("titleDocument") String titleDocument);
но это не работает.Есть какие-нибудь идеи?
Решение
Если вы используете Spring Data JPA 1.3.1 или новее, вы можете просто написать :
@Query("select f from FilledDocument f where f.relatedDocument.titleDocument like %:title%")
List<FilledDocument> findFilledDocumentByTitleDocument(@Param("title") String titleDocument);
Если вы застряли на более старой версии, то ваш код будет выглядеть следующим образом:
@Query("select f from FilledDocument f where f.relatedDocument.titleDocument like :title")
List<FilledDocument> findFilledDocumentByTitleDocument(@Param("title") String titleDocument);
И когда вы звоните в findFilledDocumentByTitleDocument
метод, который вам нужно передать
"%"+title+"%"
в качестве аргумента.
Проверять этот запись в блоге для полной истории и раздела 1.3.4
из документация.