Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Ajuda com consulta

Opa pessoal, estou precisando fazer uma consulta de pesquisa com uma condição: Trazer só os Posts com status: StatusPost.LIBERADO. Eu pesquiso tanto pelo "name" da minha entidade "Post" ou pelo "address" dele

Estou fazendo assim:

Repository:

 @Query("FROM Post p " +
            "WHERE LOWER(p.name) like %:searchTerm% " +
            "OR LOWER(p.address) like %:searchTerm%  AND p.status = :statusPost")
    Page<Post> search(@Param("searchTerm") String searchTerm, StatusPost statusPost, Pageable pageable);

Service:

 public Page<PostDTO> search(String searchTerm, StatusPost status, int page, int size) {
        PageRequest pageRequest = PageRequest.of(page, size, Sort.Direction.ASC, "name");
        return repository.search(searchTerm.toLowerCase(), status, pageRequest).map(PostDTO::created);
    }

Controller:

@GetMapping("/search")
    public Page<PostDTO> search(@RequestParam("searchTerm") String searchTerm,
                             @RequestParam(value = "page", required = false, defaultValue = "0") int page,
                             @RequestParam(value = "size", required = false, defaultValue = "24") int size) {
        return postService.search(searchTerm, StatusPost.LIBERADO, page, size);
    }

A pesquisa funciona pelo name ou address certinho, mas traz todos e não filtra apenas pelos Posts com status: StatusPost.LIBERADO.

O que estou fazendo de errado? Podem me ajudar? Abraços.

4 respostas

Oi Daniel,

Eu to achando que o problema é na ordem dos filtros da consulta, por conta do OR.

Tenta alterar para:

FROM Post p WHERE p.status = :statusPost AND LOWER(p.name) like %:searchTerm% OR LOWER(p.address) like %:searchTerm%

Opa Tentei aqui e nada meu caro, retorna todos. Eu tenho apenas um com esse status, ai traz geral.

O método que retorna todos ta funcionando de boa, é com a pesquisa que ta tenso.

solução!

Será que é porque não tem parenteses depois do AND ? :D

FROM Post p WHERE p.status = :statusPost AND ( LOWER(p.name) like %:searchTerm% OR LOWER(p.address) like %:searchTerm% )

Puts... e não era isso mesmo Rodrigo? haha Abraços e valeu mesmo.