使用spring存储库创建自定义查找器

时间:2014-07-29 13:20:06

标签: spring spring-data-jpa spring-roo

我正在使用Spring Roo和存储库层。我有两个类:Document(带文档标题)和FilledDocument(包含相关文档)。像这样:

public class Document {

    /**
     */
    @NotNull
    private String titleDocument;
    ...
}

public class FilledDocument {

    /**
     */
    @OneToOne
    private Document relatedDocument;
    ...
}

我想为FilledDocument类创建一个与atribute relatedDocument内部的title匹配的查找程序。

我使用的解决方案并不优雅高效。在我的控制器中,我有:

@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 - Reference Documentation,我正在尝试使用@Query在存储库类中,如下所示:

@Query("select f from FilledDocument f where f.relatedDocument.titleDocument containing = ?1")
public ArrayList<FilledDocument> findFilledDocumentByTitleDocument(@Param("titleDocument") String titleDocument);

但它不起作用。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果您使用的是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+"%"

作为论据。

查看this博客文章,了解完整故事和documentation1.3.4部分。