1
resposta

Sugestões de melhoria no Spring Data

Na video aula "Mostrando os Pedidos do Usuário" o professor menciona no vídeo que não seria possível criar os métodos de busca por Usuário ou por Status, mas eu lembrando das aulas de Spring Data lembrei que existiam sim métodos, usando essa documentação é possível muitas opções: https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods

Sendo assim minha classe do PedidoRepository ficou assim e funcionou muito bem:

@Repository
public interface PedidoRepository extends JpaRepository<Pedido, Long> {

    List<Pedido> findByStatus(StatusPedido status);

    List<Pedido> findByUser(User usuario);

    List<Pedido> findByUserAndStatus(User usuario, StatusPedido status);

}

E eu inicialmente chamei assim no Controller:

    @Autowired
    private PedidoRepository pedidoRepository;

    @Autowired
    private UserRepository userRepository;

    @GetMapping
    public String home(Model model, Principal principal) {

        String username = SecurityContextHolder.getContext().getAuthentication().getName();

        User usuario = userRepository.findByUsername(username);

        List<Pedido> pedidos = pedidoRepository.findByUser(usuario);
        model.addAttribute("pedidos", pedidos);
        return "home";
    }

    @GetMapping("/{status}")
    public String porStatus(@PathVariable("status") String status, Model model) {

        String username = SecurityContextHolder.getContext().getAuthentication().getName();

        User usuario = userRepository.findByUsername(username);

        List<Pedido> pedidos = pedidoRepository.findByUserAndStatus(usuario, StatusPedido.valueOf(status.toUpperCase()));
        model.addAttribute("pedidos", pedidos);
        model.addAttribute("status", status);
        return "home";
    }

É interessante fazer queries na mão também mas nesse caso eu acho que não haveria necessidade mesmo. O curso é ótimo de qualquer forma mas o poder da Spring Data JPA é bem maior do que aparenta.

Uma coisa que eu não entendi é a forma como a query ficou automatizada pelo Hibernate:

Hibernate: select pedido0_.id as id1_0_, pedido0_.data_da_entrega as data_da_2_0_, pedido0_.descricao as descrica3_0_, pedido0_.nome_produto as nome_pro4_0_, pedido0_.status as status5_0_, pedido0_.url_imagem as url_imag6_0_, pedido0_.url_produto as url_prod7_0_, pedido0_.user_username as user_use9_0_, pedido0_.valor_negociado as valor_ne8_0_ from pedido pedido0_ where pedido0_.user_username=? and pedido0_.status=?

Nesse caso não parece ser realmente o SQL puro pois precisaria fazer referência a tabela "users" certo?

1 resposta

Boa tarde,

Spring Data JPA realmente tem muita coisa, ainda vou um bom tempo lendo a documentação e testando hahaha.

Na query, acredito que não precisa acessar a tabela users pois o nome do usuário (que é o id de user) já está em uma coluna na tabela de pedidos. No final acho que faz algo tipo SELECT * FROM pedidos As p WHERE p.user_username = "lorem" AND p.status = "ENTREGUE";, para pegar os pedidos do usuário lorem com status ENTREGUE.