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
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();
}
}
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();
}
}
AI Asistan
Sorularını yanıtlamaya hazır