Classe Projeto que possui um atributo area:
@JoinColumn(name = "id_area", referencedColumnName = "id_area")
@ManyToOne
private Area area;
Classe Area:
public class Area implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "id_area", nullable = false)
private Integer idArea;
@Column(name = "DS_SIGLA", nullable = false)
private String sigla;
@Column(name = "DS_NOME", nullable = false)
private String descricao;
@Column(name = "DS_RESPONSAVEL")
private String responsavel;
@Column(name = "FL_ATIVO", nullable = false)
private Integer status;
@Column(name = "DT_INCLUSAO", nullable = false)
@Temporal(TemporalType.TIMESTAMP)
private Date dtInclusao;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "AREA_USUARIO",
joinColumns = {@JoinColumn(name="id_area")},
inverseJoinColumns = {@JoinColumn(name="id_usuario")}
)
private List<Usuario> usuarioList;
O método que faz a pesquisa:
public Servico findServicoByNumero(int numero, Usuario user, Boolean checkArea){
Servico serv = null;
Servico serv2 = null;
boolean check = true;
try {
EntityManager em = getEntityManager();
javax.persistence.Query query = em.createNamedQuery("Servico.findByNumero");
query.setParameter("numero", numero);
serv = (Servico) query.getSingleResult();
em.clear();
} catch(NoResultException nre){
throw new RegistroNaoEncontradoDaoExeption(" Nenhum registro encontrado", nre);
} catch(Exception e){
throw new DaoException("Erro ao executar Servico.findServicoByNumero", e);
} finally {
getEntityManager().close();
}
if(check == false){
return null;
}
return serv;
}
Na primeira vez ele faz a consulta e mapeia todos os objetos:
SELECT id_servico, dt_fim, observacao, numero, bl_bloqueiaaposfim, horas, descricao, dt_inicio, id_projeto, id_tiposervico, id_status FROM servico WHERE (numero = ?)
SELECT id_projeto, nome, id_area, id_equipe, id_liderprojeto FROM projeto WHERE (id_projeto = ?)
SELECT t1.id_usuario, t1.grupoldap, t1.bl_bloqueado, t1.nomesimples, t1.bl_horasrestritas, t1.matricula, t1.bl_liberadohoraextra, t1.bl_ativo, t1.mes_consolidado_adm, t1.dt_nascimento, t1.mes_consolidado_user, t1.nome, t1.senha, t1.dt_inicio, t1.username, t1.telefone, t1.dt_ultimoacesso, t1.id_empresa, t1.id_grupo, t1.id_area FROM participaprojeto t0, usuario t1 WHERE ((t0.id_projeto = ?) AND (t1.id_usuario = t0.id_usuario))
SELECT id_item, descricao, id_atividade, id_servico FROM item WHERE (id_servico = ?)
SELECT id_servico, dt_fim, observacao, numero, bl_bloqueiaaposfim, horas, descricao, dt_inicio, id_projeto, id_tiposervico, id_status FROM servico WHERE (numero = ?)
Ao efetuar outra consulta ele não percorre a tabela projetos (ponto crucial para a funcionalidade):
SELECT id_servico, dt_fim, observacao, numero, bl_bloqueiaaposfim, horas, descricao, dt_inicio, id_projeto, id_tiposervico, id_status FROM servico WHERE (numero = ?)