API backend desenvolvida em Java 21 com Spring Boot 3.2.x, como base para um sistema de delivery moderno, escalável e de fácil manutenção.
Este projeto tem como objetivo fornecer uma estrutura inicial robusta para aplicações de delivery, servindo como ponto de partida para funcionalidades como:
- Cadastro e gerenciamento de usuários e restaurantes
- Catálogo de produtos
- Gestão de pedidos
- Integração com meios de pagamento
- Monitoramento e métricas via Actuator
- Java 21 – última versão LTS, com melhorias de performance e segurança
- Spring Boot 3.2.x – criação de APIs REST com configuração mínima
- Maven – gerenciamento de dependências e ciclo de build
- H2 Database – banco de dados em memória para testes e desenvolvimento rápido
- Spring DevTools – para recarga automática durante o desenvolvimento
✅ Funcional
Aplicação rodando com sucesso, DataLoader carregando dados de teste e H2 Console ativo.
- Estrutura inicial do projeto com Spring Initializr
- Dependências essenciais configuradas (Web, JPA, H2, DevTools)
- Modelos de domínio (Cliente, Restaurante, Produto, Pedido)
- Repositories com consultas customizadas
- DataLoader para carga de dados de teste
- H2 Console configurado e funcionando
- Consultas SQL customizadas implementadas
Período: Sábado Meia-noite até Segunda-feira 14/07/2025
Este guia documenta todas as alterações realizadas no projeto delivery-tech para corrigir erros de compilação, adicionar consultas customizadas e garantir o funcionamento correto da aplicação.
- ✅ Sintaxe incorreta nos métodos setter
- ✅ Chamadas para métodos inexistentes (
setTelefone(),setEndereco()) - ✅ Aspas malformadas e caracteres especiais
- ✅ Parênteses extras nos parâmetros
Cliente clientel = new Cliente();
clientel.setNome(nome: "João Silva");
clientel.setEmail(email:"joao@email.com");
clientel.setTelefone(telefone: "11999999999");
clientel.setEndereco(endereco: "Rua A, 123");
clientel.setAtivo(ativo:true);Cliente cliente1 = new Cliente();
cliente1.setNome("João Silva");
cliente1.setEmail("joao@email.com");
cliente1.setAtivo(true);// REMOVIDO: restaurante1.setEndereco("Rua X, 123");
// MOTIVO: Método não implementado na classe Restaurante- ✅ Método retornando
Objectem vez deList<Cliente>
Object findByNomeContainingIgnoreCase(String string);List<Cliente> findByNomeContainingIgnoreCase(String nome);- ✅ Campo
valorTotalnão existe na classe Pedido (campo correto:total)
@Query("SELECT p FROM Pedido p WHERE p.valorTotal > :valor ORDER BY p.valorTotal DESC")@Query("SELECT p FROM Pedido p WHERE p.total > :valor ORDER BY p.total DESC")- ✅ Campo
valorTotalnão existe na classe Pedido (campo correto:total)
"SUM(p.valorTotal) as totalVendas, " +"SUM(p.total) as totalVendas, " +@Query(value = "SELECT p.nome, COUNT(ip.produto_id) as quantidade_vendida " +
"FROM produto p " +
"LEFT JOIN item_pedido ip ON p.id = ip.produto_id " +
"GROUP BY p.id, p.nome " +
"ORDER BY quantidade_vendida DESC " +
"LIMIT 5", nativeQuery = true)
List<Object[]> produtosMaisVendidos();@Query(value = "SELECT c.nome, COUNT(p.id) as total_pedidos " +
"FROM cliente c " +
"LEFT JOIN pedido p ON c.id = p.cliente_id " +
"GROUP BY c.id, c.nome " +
"ORDER BY total_pedidos DESC " +
"LIMIT 10", nativeQuery = true)
List<Object[]> rankingClientesPorPedidos();@Query("SELECT r.nome as nomeRestaurante, " +
"SUM(p.total) as totalVendas, " +
"COUNT(p.id) as quantidePedidos " +
"FROM Restaurante r " +
"LEFT JOIN Pedido p ON r.id = p.restaurante.id " +
"GROUP BY r.id, r.nome")
List<RelatorioVendas> relatorioVendasPorRestaurante();@Query("SELECT p.restaurante.nome, SUM(p.total) " +
"FROM Pedido p " +
"GROUP BY p.restaurante.nome " +
"ORDER BY SUM(p.total) DESC")
List<Object[]> calcularTotalVendasPorRestaurante();
@Query("SELECT p FROM Pedido p WHERE p.total > :valor ORDER BY p.total DESC")
List<Pedido> buscarPedidosComValorAcimaDe(@Param("valor") BigDecimal valor);
@Query("SELECT p FROM Pedido p " +
"WHERE p.dataPedido BETWEEN :inicio AND :fim " +
"AND p.status = :status " +
"ORDER BY p.dataPedido DESC")
List<Pedido> relatorioPedidosPorPeriodoEStatus(
@Param("inicio") LocalDateTime inicio,
@Param("fim") LocalDateTime fim,
@Param("status") StatusPedido status);package com.deliverytech.delivery_api.repository;
import java.math.BigDecimal;
public interface RelatorioVendas {
String getNomeRestaurante();
BigDecimal getTotalVendas();
Long getQuantidePedidos();
}import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;- ✅ Compilação: Sem erros
- ✅ Execução: Spring Boot iniciando corretamente
- ✅ DataLoader: 3 clientes e 2 restaurantes inseridos
- ✅ H2 Console: Disponível em
http://localhost:8080/h2-console - ✅ Consultas: Todas funcionando corretamente
=== INICIANDO CARGA DE DADOS DE TESTE ===
--- Inserindo clientes ---
✓ 3 clientes inseridos
--- Inserindo Restaurantes ---
✓ 2 restaurantes inseridos
== TESTANDO CONSULTAS DOS REPOSITORIES ==
Cliente por email: João Silva
Clientes ativos: 2
Clientes com 'silva' no nome: 1
Existe cliente com email: true
=== CARGA DE DADOS CONCLUÍDA ===
- Sempre verificar se os métodos existem antes de chamá-los
- Conferir nomes dos campos nas classes de modelo antes de usar em queries
- Sintaxe correta nos métodos setter (sem parâmetros nomeados)
- Tipos de retorno corretos nos repositories
- Imports necessários para anotações e tipos
- Adicionar campos
telefoneeendereconas classesClienteeRestaurantese necessário - Criar controllers para expor as consultas customizadas via REST API
- Implementar testes unitários para os repositories
- Adicionar validações nos modelos
- Configurar Swagger/OpenAPI para documentação da API
delivery-tech/
├── src/main/java/com/deliverytech/delivery_api/
│ ├── config/
│ │ └── DataLoader.java
│ ├── model/
│ │ ├── Cliente.java
│ │ ├── Restaurante.java
│ │ ├── Produto.java
│ │ ├── Pedido.java
│ │ └── StatusPedido.java
│ ├── repository/
│ │ ├── ClienteRepository.java
│ │ ├── RestauranteRepository.java
│ │ ├── ProdutoRepository.java
│ │ ├── PedidoRepository.java
│ │ └── RelatorioVendas.java
│ └── DeliveryApiApplication.java
├── src/main/resources/
│ └── application.properties
└── pom.xml
- Clone o repositório
- Execute a aplicação:
mvn spring-boot:run
- Acesse o H2 Console:
- URL:
http://localhost:8080/h2-console - JDBC URL:
jdbc:h2:mem:delivery - Username:
sa - Password: (deixar em branco)
- URL:
🎯 CONCLUSÃO: Todas as correções foram aplicadas com sucesso e a aplicação está funcionando