package net.ftlines.blog.cdidemo.model;
import java.util.ArrayList;
import java.util.List;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import net.ftlines.blog.cdidemo.cdi.Transactional;
@ApplicationScoped
public class EmployeesRepository {
@Inject
private EntityManager em;
public List<Employee> search(String keywords) {
String hql = "FROM Employee WHERE 1=1 ";
List<Object> params = new ArrayList<Object>();
for (String keyword : keywords.split(" ")) {
final String like = "%" + keyword + "%";
hql += " AND ( firstName LIKE (?) OR lastName LIKE (?) OR email LIKE (?) )";
params.add(like);
params.add(like);
params.add(like);
}
Query query = em.createQuery(hql);
for (int i = 0; i < params.size(); i++) {
query.setParameter(i + 1, params.get(i));
}
query.setMaxResults(20);
return query.getResultList();
}
public List<Employee> list(EmployeeCriteria criteria, int first, int max) {
return query("FROM Employee e", criteria, "ORDER BY lastName, firstName").setFirstResult(first).setMaxResults(max)
.getResultList();
}
public int count(EmployeeCriteria criteria) {
return ((Long) query("SELECT COUNT(*) FROM Employee e", criteria, "").getSingleResult()).intValue();
}
private Query query(String base, EmployeeCriteria criteria, String suffix) {
List<Object> params = new ArrayList<Object>();
String hql = base + " WHERE 1=1";
if (criteria.getHireDateMin() != null) {
hql += " AND e.hireDate>=?";
params.add(criteria.getHireDateMin());
}
if (criteria.getHireDateMax() != null) {
hql += " AND e.hireDate<=?";
params.add(criteria.getHireDateMax());
}
if (criteria.getTeam() != null) {
hql += " AND EXISTS (FROM Team t JOIN t.members AS m WHERE m.employee=e AND t=?)";
params.add(criteria.getTeam());
}
Query query = em.createQuery(hql + suffix);
for (int i = 0; i < params.size(); i++) {
query.setParameter(i + 1, params.get(i));
}
return query;
}
}