quando se usa o Projections,
o Criteria cria um objeto com apenas os campos declarados no sum() e groupProperty()
ex: seu paciente tem nome, cpf, endereço
o Criteria montará um objeto com apenas (cpf e valor),
você precisará ler o resultado do seu criteria com um Object e setá-los na sua entidade,
segue abaixo um exemplo que funcionou comigo
public List listaPontuacao(String... args) throws DaoException{
DetachedCriteria criterio = DetachedCriteria.forClass(TrDelegatario.class, "entidade");
criterio.createCriteria("entidade.trVeiculoCollection", "veic", Criteria.LEFT_JOIN)
.setFetchMode("entidade.trVeiculoCollection", FetchMode.JOIN)
.setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY);
criterio.createCriteria("veic.trNotificacaoCollection", "noti", Criteria.LEFT_JOIN)
.setFetchMode("entidade.trNotificacaoCollection", FetchMode.JOIN)
.setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY);
criterio.createCriteria("veic.trAutoInfracaoCollection", "auto", Criteria.LEFT_JOIN)
.setFetchMode("entidade.trAutoInfracaoCollection", FetchMode.JOIN)
.setResultTransformer(DetachedCriteria.DISTINCT_ROOT_ENTITY);
// nao pode constar pontuacoes de autos e notificacoes com status INDEFERIDO e CANCELADO
criterio.add(Restrictions.ne("noti.notiSituacao", 'C'));
criterio.add(Restrictions.ne("noti.notiSituacao", 'I'));
criterio.add(Restrictions.ne("auto.auinSituacao", 'C'));
criterio.add(Restrictions.ne("auto.auinSituacao", 'I'));
if(args.length > 0 && !Validator.isEmptyNullOrZero(args[0])) {
try {
Date de = new SimpleDateFormat("dd/MM/yyyy").parse(args[0]);
criterio.add(Restrictions.ge("noti.notiData", de));
} catch (ParseException e) {
e.printStackTrace();
throw new DaoException("Data inválida.");
}
}
if(args.length > 0 && !Validator.isEmptyNullOrZero(args[0])) {
try {
Date de = new SimpleDateFormat("dd/MM/yyyy").parse(args[0]);
criterio.add(Restrictions.ge("auto.auinDataAutuacao", de));
} catch (ParseException e) {
e.printStackTrace();
throw new DaoException("Data inválida.");
}
}
if(args.length > 1 && !Validator.isEmptyNullOrZero(args[1])){
try {
Date ate = new SimpleDateFormat("dd/MM/yyyy").parse(args[1]);
criterio.add(Restrictions.le("noti.notiData", ate));
} catch (ParseException e) {
e.printStackTrace();
throw new DaoException("Data inválida.");
}
}
if(args.length > 1 && !Validator.isEmptyNullOrZero(args[1])){
try {
Date ate = new SimpleDateFormat("dd/MM/yyyy").parse(args[1]);
criterio.add(Restrictions.le("auto.auinDataAutuacao", ate));
} catch (ParseException e) {
e.printStackTrace();
throw new DaoException("Data inválida.");
}
}
// fazendo somatorio de pontos e agrupando por delegatario
criterio.setProjection(Projections.projectionList()
.add(Projections.sum("noti.notiNumPontos").as("pontosA"))
.add(Projections.sum("auto.auinNumPontos").as("pontosN"))
.add(Projections.groupProperty("entidade.cadaNome"))
.add(Projections.groupProperty("entidade.deleCnpj"))
.add(Projections.groupProperty("entidade.deleCpf"))
.add(Projections.groupProperty("entidade.deleCodigo")));
criterio.addOrder(Order.asc("entidade.cadaNome"));
return findByCriteria(criterio);
}
public static void main(String[] args) throws DaoException{
TrDelegatarioDao dDAO = (TrDelegatarioDao) DAOFactory.getInstance().getDAO(TrDelegatarioDao.class);
for (Object a : dDAO.listaPontuacao("01/01/2013", "31/12/2013")) {
Object[] a_ = (Object[]) a;
Double pontosT = (Double) a_[0] + (Double) a_[1];
Double pontosN = (Double) a_[0];
Double pontosA = (Double) a_[1];
String cadaNome = (String) a_[2];
String cpf = (String) a_[3];
String cnpj = (String) a_[4];
Long deleCodigo = (Long) a_[5];
System.out.println(pontosT + " - " +
pontosN + " - " +
pontosA + " - " +
cadaNome + " - " +
cpf + " - " +
cnpj + " - " +
deleCodigo);
}
}
}