#1
This guide shows how to create custom repositories in Spring Boot with ClickHouse for flexible query handling.

1. Define an Entity

Create a simple entity mapped to a ClickHouse table:
@Entity
@Table(name = "sales")
public class Sales {
    @Id
    private Long id;
    private String product;
    private Double amount;
    private LocalDate orderDate;
}

2. Create a Base Repository

Extend JpaRepository for basic operations:
public interface SalesRepository extends JpaRepository<Sales, Long>, SalesCustomRepository {
}

3. Define a Custom Repository Interface

public interface SalesCustomRepository {
    List<Sales> findTopProductsByRevenue(int limit);
}

4. Implement the Custom Repository

Use EntityManager or JdbcTemplate for custom queries:
@Repository
public class SalesCustomRepositoryImpl implements SalesCustomRepository {

    @PersistenceContext
    private EntityManager em;

    @Override
    public List<Sales> findTopProductsByRevenue(int limit) {
        String sql = "SELECT * FROM sales ORDER BY amount DESC LIMIT :limit";
        return em.createNativeQuery(sql, Sales.class)
                 .setParameter("limit", limit)
                 .getResultList();
    }
}

5. Use the Repository in Services

@Service
public class SalesService {

    private final SalesRepository repository;

    public SalesService(SalesRepository repository) {
        this.repository = repository;
    }

    public List<Sales> getTopProducts(int limit) {
        return repository.findTopProductsByRevenue(limit);
    }
}

6. Expose an Endpoint

@RestController
@RequestMapping("/sales")
public class SalesController {

    private final SalesService service;

    public SalesController(SalesService service) {
        this.service = service;
    }

    @GetMapping("/top")
    public List<Sales> getTopProducts(@RequestParam int limit) {
        return service.getTopProducts(limit);
    }
}

image quote pre code