Dicas Hildebrando em 09 Out 2008
JPAQL - Filtrando pelo ultimo status de um historico
Para alguns sistemas toda a alteração que ocorre em uma entidade deve ser armazenada com informações como “quem alterou”, “a data” e “para qual situação mudou”. Podemos representar assim :
1 - Entidade Chamado
2 - Entidade ChamadoHistorico
3 - Entidade Status
public class Chamado {
private Integer id;
private List<ChamadoHistorico> chamadoHistoricos;
}
public class Status {
private Integer id;
private String descricao;
}
public class ChamadoHistorico {
private Integer id;
private Date data;
private Chamado chamado;
private Status status;
}
Na tela que mostra todos os chamados, precisamos retornar uma lista com os chamados e seus ultimos status. Para isso devemos criar métodos na entidade Chamado que retornem seu ultimo status algo como :
@Transient
public Status getUltimoStatus(){
Status status = null;
if(chamadoHistoricos != null && !chamadoHistoricos.isEmpty()){
for (ChamadoHistorico chamadoHistorico : chamadoHistoricos) {
status = chamadoHistorico.getStatus();
}
}
return status;
}
@Transient
public Date getUltimaData(){
Date data = null;
if(chamadoHistoricos != null && !chamadoHistoricos.isEmpty()){
for (ChamadoHistorico chamadoHistorico : chamadoHistoricos) {
data = chamadoHistorico.getData();
}
}
return data;
}
Percorrendo essa lista utilizando JSTL e EL.
<table>
<tr>
<th>Id</th>
<th>Ultima Atualizacao</th>
<th>Status</th>
</tr>
<c:forEach items=${nomeDaListaComChamados} var="chamado">
<tr>
<td>${chamado.id}</td>
<td>${chamado.ultimaData}</td>
<td>${chamado.ultimoStatus.descricao}</td>
</tr>
</c:forEach>
</table>
E da parte de JPAQL, posso ter a situação de filtrar apenas os chamados “EM ABERTO” == 1 :
select chamado from Chamado chamado left join chamado.chamadoHistoricos as historico
where historico.id in (select max(ch.id) from ChamadoHistorico ch group by ch.fise.id)
and historico.status.id = 1