Olá pessoal do fórum, estou com uma dúvida sobre o .createAlias do Criteria. Eu tenho duas classes:
public class Despachante{
@Id @GeneratedValue
private long idDespachante;
@ManyToOne
@JoinColumn(name = "ID_MUNICIPIO", insertable = true, updatable = true)
@Fetch(FetchMode.JOIN)
@Cascade(CascadeType.SAVE_UPDATE)
private Municipio municipio;
//outros atributos da classe
}
public class Municipio{
@Id @GeneratedValue
private long idMunicipio;
@OneToMany(mappedBy="municipio",fetch = FetchType.LAZY)
@Cascade(CascadeType.SAVE_UPDATE)
private Collection<Despachante> despachantes;
//outros atributos da classe
}
Na app eu tenho um método em que eu passo o nome e o Dao faz uma busca sobre o mesmo.
public List<Despachante> buscaPorNome(String nome) {
return session.createCriteria(Despachante.class)
.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE))
.addOrder(Order.asc("nome"))
.list();
}
Esse método funciona perfeitamente, mas está trazendo mais do que eu preciso pra ser exibido no view.
Pesquisei um pouco e vi a possibilidade de se usar projeções na busca. E escrevi isso:
public List<Despachante> buscaPorNome(String nome) {
return session.createAlias(Despachante.class,"d")
.add(Restrictions.ilike("nome", nome, MatchMode.ANYWHERE))
.addOrder(Order.asc("d.nome"))
.createAlias("d.municipio","m",Criteria.LEFT_JOIN)
.setProjection(Projections.projectionList()
.add(Projections.property("d.nome").as("nome"))
.add(Projections.property("d.numero").as("numero"))
.add(Projections.property("d.telefone1").as("telefone1"))
.add(Projections.property("d.telefone2").as("telefone2"))
.add(Projections.property("m.nome")))
.setResultTransformer(new AliasToBeanResultTransformer(Despachante.class))
.list();
}
O código acima tb funciona, mas na minha view na tá aparecendo uma propriedade nome do objeto Município que está dentro
da classe Despachante. Utilizei o debug e vi que a projeção tá funcionando corretamente:
19:33:11,301 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [JOÃO] as column [y0_]
19:33:11,302 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [556] as column [y1_]
19:33:11,303 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [666637] as column [y2_]
19:33:11,303 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [] as column [y3_]
19:33:11,303 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [MunicípioExemplo1] as column [y4_]
19:33:11,307 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [JOÃO MATHEUS] as column [y0_]
19:33:11,307 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [3422] as column [y1_]
19:33:11,308 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [2839289] as column [y2_]
19:33:11,308 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [] as column [y3_]
19:33:11,308 TRACE org.hibernate.type.descriptor.sql.BasicExtractor:71 - found [MunicípioExemplo5] as column [y4_]
e o sql gerado é
select
this_.NOME as y0_,
this_.NUMERO_CREDENCIAL as y1_,
this_.TELEFONE1 as y2_,
this_.TELEFONE2 as y3_,
m1_.NOME as y4_
from
DESPACHANTES this_
left outer join
MUNICIPIOS m1_
on this_.ID_MUNICIPIO=m1_.ID_MUNICIPIO
where
lower(this_.NOME) like ?
Como o sql gerado é o esperado, resolvi imprimir a lista antes de devolvê-la ao controller, e nisso dá um java.lang.NullPointerException quando eu tento imprimir:
Alguém tem alguma idéia de como se resolver isso?
Abraços a todos
Jonh