EntityQuery.java 1.89 KB
package fi.insomnia.intra.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

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


public class EntityQuery<T> {
    private String namedQuery;
    private String countQuery;
    private EntityManager em;
    private int pagesize = 0;
    private int page = 0;
    private long resultsize = 0;
    private Map<String, Object> parameters = new HashMap<String, Object>();

    private EntityQuery(String namedQuery, String countQuery, EntityManager em) {
	this.namedQuery = namedQuery;
	this.countQuery = countQuery;
	this.em = em;
    }

    @SuppressWarnings("unchecked")
    public List<T> getItems(IPagingStatus paging) {
	Query query = em.createNamedQuery(namedQuery);

	Query count = null;
	if (getPagesize() > 0) {

	    query.setFirstResult(getPage() * getPagesize());
	    query.setMaxResults(getPagesize());
	    count = em.createNamedQuery(countQuery);

	}
	
	for (Entry<String, Object> obj : parameters.entrySet()) {
	    query.setParameter(obj.getKey(), obj.getValue());
	    if (count != null) {
		count.setParameter(obj.getKey(), obj.getValue());
	    }
	}

	
	List ret = query.getResultList();
	resultsize = ret.size();
	
	if (count != null) {

	    Object resultO = count.getSingleResult();
	    if (resultO instanceof Long) {
		resultsize = ((Long) resultO);
	    } else if (resultO instanceof Integer) {
		resultsize = ((Integer) resultO).longValue();
	    }
	}

	return ret;

    }
    
    public void addParameter(String name, Object value)
    {
	parameters.put(name, value);
    }

    public long getResultsize() {
	return resultsize;
    }

    public void setPage(int page) {
	this.page = page;
    }

    public int getPage() {
	return page;
    }

    public void setPagesize(int pagesize) {
	this.pagesize = pagesize;
    }

    public int getPagesize() {
	return pagesize;
    }

}