Создайте пользовательский поисковик с помощью spring repository

StackOverflow https://stackoverflow.com//questions/25016348

Вопрос

Я использую 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 из документация.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top