Crear un buscador personalizado con el repositorio de Spring
-
21-12-2019 - |
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?
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.