Amigos,
Seguinte como resolver este problema ?
Tenho uma jsp (JSF) com uma dataTable da seguinte forma:
<h:dataTable value='#{lancamento.lancamentosProvisionado}' rendered="#{lancamento.lancamentosProvisionado != null}" var='item' border="1" cellpadding="2" cellspacing="0" style="font-size:8pt;">
<h:column>
<f:facet name="header">
<h:outputText value="Id"/>
</f:facet>
<h:outputText value="#{item.idTitulo.id}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Credor"/>
</f:facet>
<h:outputText value="#{item.idTitulo.idCredor.nome}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Descricao"/>
</f:facet>
<h:outputText value="#{item.idTitulo.descricao}"/>
</h:column>
<h:column>
<f:facet name="header">
<h:outputText value="Valor"/>
</f:facet>
R$
<h:outputText value="#{item.valor}" >
<f:convertNumber pattern="###,##0.00"/>
</h:outputText>
</h:column>
</h:dataTable>
Segue abaixo os respectivos EntityBeans:
public class Titulo implements Serializable {
@Id
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "descricao", nullable = false)
private String descricao;
@Column(name = "isMensal", nullable = false)
private boolean isMensal;
@JoinColumn(name = "idCredor", referencedColumnName = "id")
@ManyToOne
private Credor idCredor;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idTitulo")
private Collection<Agendamento> agendamentoCollection;
public class Credor implements Serializable {
@Id
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "nome", nullable = false)
private String nome;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idCredor")
private Collection<Titulo> tituloCollection;
public class Agendamento implements Serializable {
@Id
@Column(name = "id", nullable = false)
private Integer id;
@Column(name = "numero", nullable = false)
private int numero;
@Column(name = "valor", nullable = false)
private double valor;
@Column(name = "vencimento", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date vencimento;
@Column(name = "status", nullable = false)
private boolean status;
@JoinColumn(name = "idTitulo", referencedColumnName = "id")
@ManyToOne
private Titulo idTitulo;
@JoinColumn(name = "idConta", referencedColumnName = "id")
@ManyToOne
private Conta idConta;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "idAgendamento")
private Collection<Lancamento> lancamentoCollection;
O problema é na query, quer dizer nao que a query esteja errada, mais como eu consigo recuperar o resuldado da query… ou como eu crio o objecto para recuperar na JSP ?
String query = "SELECT a.idTitulo.id, c.nome, t.descricao, avg(a.valor) FROM Agendamento a, Titulo t, Credor c where a.idTitulo.isMensal = 1 and a.idTitulo.id = t.id and t.idCredor = c.id GROUP BY a.idTitulo.id, c.nome, t.descricao";
Query q = em.createQuery(query);
como eu nao achei uma forma correcta de fazer isso eu fiz a criacao dos objectos na mao msmo.
Existe alguma forma correcta ???
Abaixo segue a forma que eu encontrei para popular o resultado da query na pagina (pagina acima)
public DataModel getLancamentosProvisionado() {
EntityManager em = getEntityManager();
try{
String query = "SELECT a.idTitulo.id, c.nome, t.descricao, avg(a.valor) FROM Agendamento a, Titulo t, Credor c where a.idTitulo.isMensal = 1 and a.idTitulo.id = t.id and t.idCredor = c.id GROUP BY a.idTitulo.id, c.nome, t.descricao";
Query q = em.createQuery(query);
List list = q.getResultList();
List result = new ArrayList();
for (int i = 0; i < list.size(); i++) {
Object[] obj = (Object[]) list.get(i);
Agendamento a = new Agendamento();
Titulo t = new Titulo();
Credor c = new Credor();
t.setId(Integer.parseInt(obj[0].toString()));
c.setNome(obj[1].toString());
t.setDescricao(obj[2].toString());
a.setValor(Double.parseDouble(obj[3].toString()));
a.setIdTitulo(t);
t.setIdCredor(c);
result.add(a);
}
model = new ListDataModel(result);
} finally {
em.close();
}
return model;
}