Olá pessoal, blz? Seguinte, tenho uma entidade mapeada com o @NamedNativeQuery e um @Loader para a mesma. Até aí tudo bem mas, eu preciso que todos as consultas feitas com esta entidade sejam feitas em cima do resultado da query que defini em @NamedNativeQuery, inclusive nos Joins. Um exemplo:
Tenho a classe Usuario:
@Entity
@Table(name = "TBL_USUARIO")
public class Usuario implements Serializable {
/**
*
*/
private static final long serialVersionUID = 6614900362487520714L;
@Column(name = "NOME")
private String nome;
@Id
@Column(name = "MATRICULA", nullable = false)
private long matricula;
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "TBL_USUARIO_PERFIL", joinColumns = {@JoinColumn(name = "USUARIO_MATRICULA"}, inverseJoinColumns = {@JoinColumn(name = "PERFIL_CODIGO")})
private List<Perfil> perfis;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public long getMatricula() {
return matricula;
}
public void setMatricula(long matricula) {
this.matricula = matricula;
}
@Override
public String toString() {
return nome;
}
public List<Perfil> getPerfis() {
return Collections.unmodifiableList(perfis);
}
public void setPerfis(List<Perfil> perfis) {
this.perfis = perfis;
}
public void addPerfil(Perfil perfil) {
if (perfis == null) {
perfis = new LinkedList<Perfil>();
}
perfis.add(perfil);
}
}
que tem um relacionamento N->N com a classe Perfil:
@Entity
@Table(name = "TBL_PERFIL")
@NamedNativeQuery(name = "perfil_sgl", query = "SELECT CODIGO, SISTEMA_SIGLA, DESCRICAO FROM TBL_PERFIL WHERE SISTEMA_SIGLA = 'SGL' ORDER BY CODIGO", resultClass = Perfil.class)
@Loader(namedQuery = "perfil_sgl")
public class Perfil implements Serializable {
@Id
@Column(name = "CODIGO")
private int codigo;
@Column(name = "SISTEMA_SIGLA")
private String siglaSistema;
@Column(name = "DESCRICAO")
private String descricao;
public int getCodigo() {
return codigo;
}
public void setCodigo(int codigo) {
this.codigo = codigo;
}
public String getSiglaSistema() {
return siglaSistema;
}
public String getDescricao() {
return descricao;
}
public void setDescricao(String descricao) {
this.descricao = descricao;
}
}
Realizado pela tabela USUARIO_PERFIL como pode ser visto na classe Usuario. O problema é que quando mando trazer os perfis de usuário, ele me traz todos os perfis e não só o perfis do sistema da sigla ‘SGL’, como especificado na query ‘perfil_sgl’. Não sei se entenderam mas, quero saber se tem como esse mapeamento funcionar com uma View, que já possui resultados filtrados (no caso, trazendo só os perfis cuja a sigla do sistema é ‘SGL’) antes de qualquer coisa. Ou vou ter que preencher esse relacionamento ‘na mão’(realizando uma consulta) mesmo. Valeu!
obs.: Usei um exemplo hipotético mas, estou mapeando umas tabelas de sistemas ‘legados’ esse lance da sigla existe mesmo.
Paz e bem!