ranyeli
9/3/2017 - 8:08 PM

sample data access object for common crud operations

sample data access object for common crud operations

package com.project.dao;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@Repository
@Transactional
public class GenericDao<T> {

	@Autowired
	protected EntityManager entityManager;

	public void save(T entity) {

		entityManager.persist(entity);
	}

	public void saveAll(List<T> entities) {

		entities.forEach(entity->entityManager.persist(entity));
	}

	public void update(T entity) {

		entityManager.merge(entity);
	}

	public void delete(T entity) {

		if (entityManager.contains(entity))
			entityManager.remove(entity);
		else
			entityManager.remove(entityManager.merge(entity));
	}

	public T findById(Class<T> clazz, long id) {
		return entityManager.find(clazz, id);
	}
	
	public <A> A referTo(Class<A> clazz, long id) {
		return entityManager.getReference(clazz, id);
	}
	
	public <A> List<A> referToAll(Class<A> clazz, List<Long> ids){
		List<A> ref = new ArrayList<A>();
		ids.forEach(id->ref.add(entityManager.getReference(clazz, id)));
		return ref;
	}

	@SuppressWarnings("unchecked")
	public List<T> findAll(Class<T> clazz, Integer offset, Integer limit) {

		Query query = entityManager.createQuery("from " + clazz.getName());
		if (offset != null)
			query.setFirstResult(offset);
		if (limit != null)
			query.setMaxResults(limit);

		return query.getResultList();
	}

	@SuppressWarnings("unchecked")
	public List<T> findAll(Class<T> clazz) {

		return entityManager.createQuery("from " + clazz.getName()).getResultList();
	}
	
	public <A> Long count(Class<A> clazz) {
		String clazzName = clazz.getName();
		TypedQuery<Long> query = entityManager.createQuery(
				"SELECT COUNT(*) FROM " + clazzName + " entity", Long.class
				); 
		return (Long) query.getSingleResult();
	}
}