package au.com.vaadinutils.dao;
import java.util.LinkedList;
import java.util.List;
import javax.persistence.Tuple;
import javax.persistence.criteria.Path;
import javax.persistence.criteria.Selection;
import javax.persistence.metamodel.SingularAttribute;
public class JpaDslTupleBuilder<E> extends JpaDslAbstract<E, Tuple>
{
private List<Selection<?>> multiselects = new LinkedList<>();
JpaDslTupleBuilder(Class<E> entityClass)
{
this.entityClass = entityClass;
builder = getEntityManager().getCriteriaBuilder();
criteria = builder.createTupleQuery();
root = criteria.from(entityClass);
}
public <T> Path<T> multiselect(final SingularAttribute<E, T> attribute)
{
final Path<T> path = root.get(attribute);
multiselects.add(path);
return path;
}
public <T> Path<T> multiselect(final Path<T> path)
{
multiselects.add(path);
return path;
}
public <J, T> Path<T> multiselect(final JoinBuilder<E, J> join, final SingularAttribute<J, T> attribute)
{
final Path<T> path = getJoin(join).get(attribute);
multiselects.add(path);
return path;
}
public <J, T> Selection<T> multiselect(final JoinBuilder<E, J> join, final SingularAttribute<J, T> attribute, final String alias)
{
final Selection<T> selection = getJoin(join).get(attribute).alias(alias);
multiselects.add(selection);
return selection;
}
public JpaDslTupleBuilder<E> multiselect(final Selection<?> selection)
{
multiselects.add(selection);
return this;
}
@Override
public List<Tuple> getResultList()
{
criteria.multiselect(multiselects);
return super.getResultList();
}
@Override
public Tuple getSingleResult()
{
criteria.multiselect(multiselects);
return super.getSingleResult();
}
@Override
public Tuple getSingleResultOrNull()
{
criteria.multiselect(multiselects);
return super.getSingleResultOrNull();
}
}