Shaping the generic DAO design pattern and using jOOQ
Trying to implement the generic DAO from Figure 4.2 starts with the generic interface, ClassicModelsRepository:
@Repository
@Transactional(readOnly = true)
public interface ClassicModelsRepository<T, ID> {
  List<T> fetchAll();
  @Transactional
  void deleteById(ID id);
}
While ClassicModelsRepository contains the common query methods, SaleRepository extends it to add specific query methods, as follows:
@Repository
@Transactional(readOnly = true)
public interface SaleRepository
        extends ClassicModelsRepository<Sale, Long> {
  public List<Sale> findSaleByFiscalYear(int year);
  public List<Sale> findSaleAscGtLimit(double limit);
}
The implementation of SaleRepository provides implementations for methods from both interfaces:
@Repository public class SaleRepositoryImpl implements SaleRepository...