public interface GenericRepository { Optional findById(ID id); List findAll(); List findAll(Pageable pageable); T save(T entity); void deleteById(ID id); boolean existsById(ID id); long count(); } @Repository public abstract class GenericRepositoryImpl implements GenericRepository { @PersistenceContext protected EntityManager em; private final Class entityClass; @SuppressWarnings("unchecked") public GenericRepositoryImpl() { this.entityClass = (Class) ((ParameterizedType) getClass() .getGenericSuperclass()).getActualTypeArguments()[0]; } @Override public Optional findById(ID id) { return Optional.ofNullable(em.find(entityClass, id)); } @Override public List findAll() { String jpql = "SELECT e FROM " + entityClass.getSimpleName() + " e"; return em.createQuery(jpql, entityClass).getResultList(); } @Override @Transactional public T save(T entity) { em.persist(entity); return entity; } @Override @Transactional public void deleteById(ID id) { findById(id).ifPresent(em::remove); } @Override public boolean existsById(ID id) { return findById(id).isPresent(); } @Override public long count() { String jpql = "SELECT COUNT(e) FROM " + entityClass.getSimpleName() + " e"; return em.createQuery(jpql, Long.class).getSingleResult(); } } // Kullanım @Repository public class UserRepository extends GenericRepositoryImpl { public Optional findByEmail(String email) { return em.createQuery( "SELECT u FROM User u WHERE u.email = :email", User.class) .setParameter("email", email) .getResultStream().findFirst(); } }