İçeriğe geç
java

Java Generic Repository Pattern

JPA ile generic repository pattern implementasyonu. Tekrar eden CRUD kodlarını ortadan kaldırır.

By Tolgahan · · 282 görüntülenme
java
public interface GenericRepository<T, ID> {
    Optional<T> findById(ID id);
    List<T> findAll();
    List<T> findAll(Pageable pageable);
    T save(T entity);
    void deleteById(ID id);
    boolean existsById(ID id);
    long count();
}

@Repository
public abstract class GenericRepositoryImpl<T, ID extends Serializable>
        implements GenericRepository<T, ID> {

    @PersistenceContext
    protected EntityManager em;

    private final Class<T> entityClass;

    @SuppressWarnings("unchecked")
    public GenericRepositoryImpl() {
        this.entityClass = (Class<T>) ((ParameterizedType) getClass()
            .getGenericSuperclass()).getActualTypeArguments()[0];
    }

    @Override
    public Optional<T> findById(ID id) {
        return Optional.ofNullable(em.find(entityClass, id));
    }

    @Override
    public List<T> 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<User, Long> {
    public Optional<User> findByEmail(String email) {
        return em.createQuery(
            "SELECT u FROM User u WHERE u.email = :email", User.class)
            .setParameter("email", email)
            .getResultStream().findFirst();
    }
}
Bu snippet'i göm
<iframe src="https://tolgahan.dev/snippets/java-generic-repository-pattern/embed" width="100%" height="400" frameborder="0"></iframe>
Paylaş: