Pregunta

Estoy usando Spring Roo con capas de repositorio.Tengo dos clases:Documento (con el título del documento) y FilledDocument (que contiene el Documento relacionado).Como esto:

public class Document {

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

public class FilledDocument {

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

Me gustaría crear un buscador para la clase FilledDocument que coincida con el título dentro del atributo relatedDocument.

Estoy usando una solución que no es elegante ni eficiente.En mi controlador tengo:

@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";
}

estoy leyendo esto Spring Data JPA - Documentación de referencia y estoy probando con @Query en la clase de repositorio, así:

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

pero no funciona.¿Algunas ideas?

¿Fue útil?

Solución

Si está utilizando Spring Data JPA 1.3.1 o más reciente, simplemente puede escribir:

@Query("select f from FilledDocument f where f.relatedDocument.titleDocument like %:title%")
List<FilledDocument> findFilledDocumentByTitleDocument(@Param("title") String titleDocument);

Si está atascado en una versión anterior, su código sería:

@Query("select f from FilledDocument f where f.relatedDocument.titleDocument like :title")
List<FilledDocument> findFilledDocumentByTitleDocument(@Param("title") String titleDocument);

Y cuando llamas al findFilledDocumentByTitleDocument método que necesitas para pasar

"%"+title+"%"

como argumento.

Verificar este publicación de blog para la historia completa y la sección 1.3.4 del documentación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top