2017-02-07 63 views
6

Jak mówi tytuł.Jak mogę filtrować dane w spokojny sposób przy użyciu Springa?

I w zasadzie chciałbym zrobić żądania jak

/api/todos/?completed=eq.true&created_at=lt.1486462109399 

Czy istnieje gotowy spring way osiągnięcia takiego? Coś podobnego do mechanizmu Page/Pageable byłoby świetne.

Jeśli nie istnieje, myślę, że mógłbym go zaimplementować przy użyciu zapytań o Kryteria Hibernacji & Argument Re-solvers. Zasadniczo pozwala mi napisać moje kontrolerów jak

@GetMapping 
public ResponseEntity<Page<TodoDTO>> listAll(Criteria criteria, Pageable pageable) 
{ 
     Page<Todo> todos = todoService.listAll(criteria, pageable) 
     ... 
} 

Niestandardowy Argument rezolwer byłby odpowiedzialny za obracanie ciąg kwerendy do kryteriów. Nie jestem do końca pewien, jak sobie z tym poradzić w ramach usługi, ale to jest kierunek, w którym spróbuję to zaimplementować.

Czy to byłoby dobre podejście? Wszelkie zalecenia? (Wszyscy zakładają, że nie ma już gotowego mechanizmu dla takich już).

Twoja pomoc jest bardzo cenna.

+0

Ostatni raz miałem ten sam problem, nie mogłem znaleźć sprężynę jedynym rozwiązaniem. Możesz jednak sprawdzić, jak to osiągnąć, używając funkcji Fiql/rsql z Oto dobry [blog] (http://www.baeldung.com/rest-api-search-language-rsql-fiql) na ten temat. – gkatzioura

+0

Minął rok od zadawania tego pytania i nie wiem, gdzie jesteś, ale to powinno odpowiedzieć na twój problem: http://www.baeldung.com/rest-api-search-language-spring-data- dane techniczne Możesz również sprawdzić to pytanie: https://stackoverflow.com/questions/20280708/filtering-database-rows-with-spring-data-jpa-and-spring-mvc – leventunver

Odpowiedz

1

Inną opcją zbudować biegle API zapytań jest użycie parsera RSQL. RSQL to język zapytań do sparametryzowanego filtrowania wpisów w API RESTful. Śledź this article a API byłby w stanie obsługiwać adresy jak: kontroler

http://localhost:8080/users?search=firstName==jo*;age<25 

Sample:

@RestController 
@RequestMapping(value = "/users") 
public class UserController { 

    @Autowired 
    private UserRepository repo; 

    @GetMapping 
    public List<User> findAllByRsql(@RequestParam(value = "search") String search) { 
     Node rootNode = new RSQLParser().parse(search); 
     Specification<User> spec = rootNode.accept(new CustomRsqlVisitor<User>()); 
     return repo.findAll(spec); 
    } 

} 
0

Można zbudować Search/Filter REST API using Spring Data JPA and Specifications. Oto przykład Test URL, które powstały API byłby w stanie obsługiwać:

http://localhost:8080/users?search=lastName:doe,age>25 

i przykład kontroler:

@RestController 
@RequestMapping(value = "/users") 
public class UserController { 

    @Autowired 
    private UserRepository repo; 

    @GetMapping 
    public List<User> search(@RequestParam(value = "search") String search) { 
     UserSpecificationsBuilder builder = new UserSpecificationsBuilder(); 
     Pattern pattern = Pattern.compile("(\w+?)(:|<|>)(\w+?),"); 
     Matcher matcher = pattern.matcher(search + ","); 
     while (matcher.find()) { 
      builder.with(matcher.group(1), matcher.group(2), matcher.group(3)); 
     } 

     Specification<User> spec = builder.build(); 
     return repo.findAll(spec); 
    } 
}