package com.tri.ui.test.infrastructur.persistence;
import java.io.Serializable;
import java.util.List;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import org.apache.commons.lang3.StringUtils;
import com.tri.persistence.jpql.QueryBuilder;
import com.tri.ui.test.domain.model.sample.Sample;
import com.tri.ui.test.domain.model.sample.SampleRepository;
@Stateless
@TransactionAttribute(TransactionAttributeType.SUPPORTS)
public class SampleRepositoryJpa implements SampleRepository, Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext(unitName = "default")
EntityManager em;
@Override
public List<Sample> findSamples(final int first, final int max,
final String name, final Long age, List<String> sorting) {
QueryBuilder builder = querySamples(name, age);
builder.select.add("s");
if (sorting != null) {
for (String sort : sorting) {
builder.order.add("s." + sort);
}
}
return builder.createQuery(em, Sample.class)
.setFirstResult((int) first).setMaxResults(max).getResultList();
}
@Override
public long countSamples(final String name, final Long age) {
QueryBuilder builder = querySamples(name, age);
builder.select.add("COUNT(s)");
return builder.createQuery(em, Long.class).getSingleResult();
}
QueryBuilder querySamples(final String name, final Long age) {
QueryBuilder builder = new QueryBuilder();
builder.from.add("Sample s");
if (StringUtils.isNotBlank(name)) {
builder.where.add("UPPER(s.name) like :name");
builder.setParameter("name", "%" + name.toUpperCase() + "%");
}
if (age != null) {
builder.where.add("s.age = :age");
builder.setParameter("age", age);
}
return builder;
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void storeSample(Sample sample) {
em.persist(sample);
}
@Override
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public void removeSample(Sample sample) {
em.remove(sample);
}
}