Olá pessoal.
Estou com problema em uma consulta com hibernate que não estou conseguindo achar a solução. O banco de dados ja é antigo e por isso tem uma classe PK. Aí vão as classes:
Classe Geral (tabela GERAL)
@Entity
@Table(schema = "CAD", name = "GERAL")
public class Cadastro {
@Id
@Column(name = "NUM_CADASTRO")
@NotEmpty
private int numero;
...
@OneToMany(fetch = FetchType.LAZY, mappedBy = "atividadePessoaPK.cadastro")
private List<AtividadePessoa> atividadePessoa;
.. // getters e setters
Classe AtividadePessoa (tabela ATIVID_PESSOA)
@Entity(name = "atividadePessoa")
@Table(schema = "CAD", name = "ATIVID_PESSOA")
public class AtividadePessoa {
@EmbeddedId
private AtividadePessoaPK atividadePessoaPK;
@Column(name = "DTA_EXCLUSAO")
Calendar dataExclusao;
..//outros campos - getters e setters
Classe PK - AtividadePessoaPK
@SuppressWarnings("serial")
@Embeddable
public class AtividadePessoaPK implements Serializable {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "NUM_CADASTRO", referencedColumnName = "NUM_CADASTRO")
private Cadastro cadastro;
@ManyToOne(fetch = FetchType.LAZY) //, targetEntity = Atividade.class)
@JoinColumn(name = "COD_ATIVIDADE", referencedColumnName = "COD_ATIVIDADE" )
private AtividadeCadastro atividade;
@Column(name = "DTA_INICIO_ATV")
Calendar dataInicioAtividade;
... //getters and setters
E finalmente a classe AtividadeCadastro (tabela ATIVIDADES)
@Entity(name = "atividades")
@Table(schema = "CAD", name = "ATIVIDADES")
public class AtividadeCadastro {
@Id
@Column(name = "COD_ATIVIDADE")
private int codigo;
@Column(name = "DSC_ATIVIDADE")
private String descricao;
@Column(name = "IDN_COMISSAO")
private String comissao;
... //getters e setters
O que eu quero fazer é a seguinte consulta:
SELECT * FROM CAD.GERAL G
INNER JOIN CAD.ATIVID_PESSOA AP ON AP.NUM_CADASTRO = G.NUM_CADASTRO
INNER JOIN ATIVIDADES A ON A.COD_ATIVIDADE = AP.COD_ATIVIDADE
WHERE A.IDN_COMISSAO = 'V'
WITH UR
Em Hibernate
public List<Cadastro> pegaTodos(int start, int limit) {
Criteria c = session.createCriteria(Cadastro.class);
if (limit > 0) {
c.setFirstResult(start);
c.setMaxResults(limit);
}
if (isFiltroVendedor()) {
c.createAlias("atividadePessoa", "atividadePessoa");
c.createAlias("atividadePessoa.atividadePessoaPK.atividade", "atividade");
c.add(Restrictions.eq("atividade.comissao","V"));
}
c.addOrder(Order.asc("id"));
return (List<Cadastro>) c.list();
}
Tem uma propriedade filtroVendedor antes de fazer a consulta que seto para true e assim ele passa pelo método isFiltroVendedor. A questão que o hibernate não faz o inner join com a tabela ATIVIDADES , somente com ATIVID_PESSOA que podem ser várias para cada cadastro. E assim ele gera a SQL mas como não faz o inner join com ATIVIDADES ele não encontra o campo “comissao” .
Ja tentei com createCriteria(para cada classe), setFetchMode e nada funcionou. Não sei se é alguma coisa errada nas entidades com os relacionamentos ou alguma coisa que precisa ser feita na consulta do hibernate.
Obrigado desde já.