[Hibernate]Filtrar as childrens de um Auto-relacionamento

Olá pessoas, estou com um pequeno problema com relação à busca de uma classe que possui um auto relacionamento. Vou tentar explicar da melhor forma possível o que eu quero e abaixo seguem as minhas classes.

Eu tenho uma tabela de Menus que faz um auto-relacionamento e uma tabela de Papeis onde cada registro aponta para um menu, essa tabela é ligada à tabela de usuarios através de uma auxiliar.

Eu preciso trazer os menus de acordo com os papeis relacionados ao usuário em específico, o meu problema é que a minha intenção é trazer apenas os menus parent (nivel 1) com as childrens que possuem o usuario (através do papel), e o que está acontecendo é que ele está trazendo os parents corretamente, porém com todas as childrens que esse parent possue, independente do papel. Não sei se ficou claro o suficiente…

seguem os códigos (package, imports e construtores omitidos propositalmente):

Menu.java


@Entity
@Table(name = "menu", catalog = "lnet")
public class Menu implements java.io.Serializable {

	private Long menuId;
	private Menu menu;
	private String menuDescricao;
	private Integer menuNivel;
	private String menuTitulo;
	private String menuPagina;
	private Boolean menuGeral;
	private String menuMensagem;
	private Integer menuOrdem;
	private Set<Papeis> papeises = new HashSet<Papeis>(0);
	private Set<Menu> menus = new HashSet<Menu>(0);
	private Set<AuxiliarMenusmodulos> auxiliarMenusmoduloses = new HashSet<AuxiliarMenusmodulos>(
			0);

	public Menu() {
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "menu_id", unique = true, nullable = false)
	public Long getMenuId() {
		return this.menuId;
	}

	public void setMenuId(Long menuId) {
		this.menuId = menuId;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "menu_menu_id")
	public Menu getMenu() {
		return this.menu;
	}

	public void setMenu(Menu menu) {
		this.menu = menu;
	}

	@Column(name = "menu_descricao", length = 45)
	public String getMenuDescricao() {
		return this.menuDescricao;
	}

	public void setMenuDescricao(String menuDescricao) {
		this.menuDescricao = menuDescricao;
	}

	@Column(name = "menu_nivel")
	public Integer getMenuNivel() {
		return this.menuNivel;
	}

	public void setMenuNivel(Integer menuNivel) {
		this.menuNivel = menuNivel;
	}

	@Column(name = "menu_titulo", length = 100)
	public String getMenuTitulo() {
		return this.menuTitulo;
	}

	public void setMenuTitulo(String menuTitulo) {
		this.menuTitulo = menuTitulo;
	}

	@Column(name = "menu_pagina", length = 1000)
	public String getMenuPagina() {
		return this.menuPagina;
	}

	public void setMenuPagina(String menuPagina) {
		this.menuPagina = menuPagina;
	}

	@Column(name = "menu_geral")
	public Boolean getMenuGeral() {
		return this.menuGeral;
	}

	public void setMenuGeral(Boolean menuGeral) {
		this.menuGeral = menuGeral;
	}

	@Column(name = "menu_mensagem", length = 100)
	public String getMenuMensagem() {
		return this.menuMensagem;
	}

	public void setMenuMensagem(String menuMensagem) {
		this.menuMensagem = menuMensagem;
	}

	@Column(name = "menu_ordem")
	public Integer getMenuOrdem() {
		return this.menuOrdem;
	}

	public void setMenuOrdem(Integer menuOrdem) {
		this.menuOrdem = menuOrdem;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "menu")
	public Set<Papeis> getPapeises() {
		return this.papeises;
	}

	public void setPapeises(Set<Papeis> papeises) {
		this.papeises = papeises;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "menu")
	public Set<Menu> getMenus() {
		return this.menus;
	}

	public void setMenus(Set<Menu> menus) {
		this.menus = menus;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "menu")
	public Set<AuxiliarMenusmodulos> getAuxiliarMenusmoduloses() {
		return this.auxiliarMenusmoduloses;
	}

	public void setAuxiliarMenusmoduloses(
			Set<AuxiliarMenusmodulos> auxiliarMenusmoduloses) {
		this.auxiliarMenusmoduloses = auxiliarMenusmoduloses;
	}

}

Papeis.java

@Entity
@Table(name = "papeis", catalog = "lnet")
public class Papeis implements java.io.Serializable {

	private Long papelId;
	private Menu menu;
	private Acoes acoes;
	private String papelNome;
	private Integer papelTipo;
	private Boolean papelPadrao;
	private Boolean papelSituacao;
	private Set<AuxiliarUsuariospapeis> auxiliarUsuariospapeises = new HashSet<AuxiliarUsuariospapeis>(
			0);

	public Papeis() {
	}	Set<AuxiliarUsuariospapeis> auxiliarUsuariospapeises) {
		this.menu = menu;
		this.acoes = acoes;
		this.papelNome = papelNome;
		this.papelTipo = papelTipo;
		this.papelPadrao = papelPadrao;
		this.papelSituacao = papelSituacao;
		this.auxiliarUsuariospapeises = auxiliarUsuariospapeises;
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "papel_id", unique = true, nullable = false)
	public Long getPapelId() {
		return this.papelId;
	}

	public void setPapelId(Long papelId) {
		this.papelId = papelId;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "papel_menu_id", nullable = false)
	public Menu getMenu() {
		return this.menu;
	}

	public void setMenu(Menu menu) {
		this.menu = menu;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "papel_acao_id")
	public Acoes getAcoes() {
		return this.acoes;
	}

	public void setAcoes(Acoes acoes) {
		this.acoes = acoes;
	}

	@Column(name = "papel_nome", length = 45)
	public String getPapelNome() {
		return this.papelNome;
	}

	public void setPapelNome(String papelNome) {
		this.papelNome = papelNome;
	}

	@Column(name = "papel_tipo")
	public Integer getPapelTipo() {
		return this.papelTipo;
	}

	public void setPapelTipo(Integer papelTipo) {
		this.papelTipo = papelTipo;
	}

	@Column(name = "papel_padrao")
	public Boolean getPapelPadrao() {
		return this.papelPadrao;
	}

	public void setPapelPadrao(Boolean papelPadrao) {
		this.papelPadrao = papelPadrao;
	}

	@Column(name = "papel_situacao")
	public Boolean getPapelSituacao() {
		return this.papelSituacao;
	}

	public void setPapelSituacao(Boolean papelSituacao) {
		this.papelSituacao = papelSituacao;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "papeis")
	public Set<AuxiliarUsuariospapeis> getAuxiliarUsuariospapeises() {
		return this.auxiliarUsuariospapeises;
	}

	public void setAuxiliarUsuariospapeises(
			Set<AuxiliarUsuariospapeis> auxiliarUsuariospapeises) {
		this.auxiliarUsuariospapeises = auxiliarUsuariospapeises;
	}

}

AuxiliarUsuariospapeis.java


@Entity
@Table(name = "auxiliar_usuariospapeis", catalog = "lnet")
public class AuxiliarUsuariospapeis implements java.io.Serializable {

	private Long auxupId;
	private CadastroUsuarios cadastroUsuarios;
	private Papeis papeis;
	private Set<AuxiliarUsuariospapeisfiliais> auxiliarUsuariospapeisfiliaises = new HashSet<AuxiliarUsuariospapeisfiliais>(
			0);

	public AuxiliarUsuariospapeis() {
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "auxup_id", unique = true, nullable = false)
	public Long getAuxupId() {
		return this.auxupId;
	}

	public void setAuxupId(Long auxupId) {
		this.auxupId = auxupId;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "auxup_cadus_id", nullable = false)
	public CadastroUsuarios getCadastroUsuarios() {
		return this.cadastroUsuarios;
	}

	public void setCadastroUsuarios(CadastroUsuarios cadastroUsuarios) {
		this.cadastroUsuarios = cadastroUsuarios;
	}

	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "auxup_papel_id", nullable = false)
	public Papeis getPapeis() {
		return this.papeis;
	}

	public void setPapeis(Papeis papeis) {
		this.papeis = papeis;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "auxiliarUsuariospapeis")
	public Set<AuxiliarUsuariospapeisfiliais> getAuxiliarUsuariospapeisfiliaises() {
		return this.auxiliarUsuariospapeisfiliaises;
	}

	public void setAuxiliarUsuariospapeisfiliaises(
			Set<AuxiliarUsuariospapeisfiliais> auxiliarUsuariospapeisfiliaises) {
		this.auxiliarUsuariospapeisfiliaises = auxiliarUsuariospapeisfiliaises;
	}

}

CadastroUsuarios.java


@Entity
@Table(name = "cadastro_usuarios", catalog = "lnet")
public class CadastroUsuarios implements java.io.Serializable {

	private Long cadusId;
	private String cadusLogin;
	private String cadusSenha;
	private String cadusNome;
	private Date cadusNascimento;
	private String cadusRamal;
	private String cadusEmail;
	private String cadusCelular;
	private String cadusNextel;
	private String cadusTelefonepessoal;
	private String cadusCelularpessoal;
	private Integer cadusCor;
	private Date cadusDatacadastro;
	private Date cadusUltimaalteracao;
	private Boolean cadusSituacao;
	private Set<AuxiliarUsuariospapeis> auxiliarUsuariospapeises = new HashSet<AuxiliarUsuariospapeis>(
			0);
	private Set<AuxiliarUsuariosfiliais> auxiliarUsuariosfiliaises = new HashSet<AuxiliarUsuariosfiliais>(
			0);
	private Set<CadastroAvaliacoeshistoricos> cadastroAvaliacoeshistoricoses = new HashSet<CadastroAvaliacoeshistoricos>(
			0);
	private Set<AuxiliarInformativosusuarios> auxiliarInformativosusuarioses = new HashSet<AuxiliarInformativosusuarios>(
			0);
	private Set<CadastroEstoquehistoricos> cadastroEstoquehistoricoses = new HashSet<CadastroEstoquehistoricos>(
			0);
	private Set<CadastroInformativos> cadastroInformativoses = new HashSet<CadastroInformativos>(
			0);
	private Set<AuxiliarAutomoveisdados> auxiliarAutomoveisdadoses = new HashSet<AuxiliarAutomoveisdados>(
			0);
	private Set<GrupoUsuarios> grupoUsuarioses = new HashSet<GrupoUsuarios>(0);
	private Set<CadastroSites> cadastroSiteses = new HashSet<CadastroSites>(0);

	public CadastroUsuarios() {
	}

	@Id
	@GeneratedValue(strategy = IDENTITY)
	@Column(name = "cadus_id", unique = true, nullable = false)
	public Long getCadusId() {
		return this.cadusId;
	}

	public void setCadusId(Long cadusId) {
		this.cadusId = cadusId;
	}

	@Column(name = "cadus_login", length = 45)
	public String getCadusLogin() {
		return this.cadusLogin;
	}

	public void setCadusLogin(String cadusLogin) {
		this.cadusLogin = cadusLogin;
	}

	@Column(name = "cadus_senha", length = 45)
	public String getCadusSenha() {
		return this.cadusSenha;
	}

	public void setCadusSenha(String cadusSenha) {
		this.cadusSenha = cadusSenha;
	}

	@Column(name = "cadus_nome", length = 200)
	public String getCadusNome() {
		return this.cadusNome;
	}

	public void setCadusNome(String cadusNome) {
		this.cadusNome = cadusNome;
	}

	@Temporal(TemporalType.DATE)
	@Column(name = "cadus_nascimento", length = 10)
	public Date getCadusNascimento() {
		return this.cadusNascimento;
	}

	public void setCadusNascimento(Date cadusNascimento) {
		this.cadusNascimento = cadusNascimento;
	}

	@Column(name = "cadus_ramal", length = 45)
	public String getCadusRamal() {
		return this.cadusRamal;
	}

	public void setCadusRamal(String cadusRamal) {
		this.cadusRamal = cadusRamal;
	}

	@Column(name = "cadus_email", length = 200)
	public String getCadusEmail() {
		return this.cadusEmail;
	}

	public void setCadusEmail(String cadusEmail) {
		this.cadusEmail = cadusEmail;
	}

	@Column(name = "cadus_celular", length = 45)
	public String getCadusCelular() {
		return this.cadusCelular;
	}

	public void setCadusCelular(String cadusCelular) {
		this.cadusCelular = cadusCelular;
	}

	@Column(name = "cadus_nextel", length = 45)
	public String getCadusNextel() {
		return this.cadusNextel;
	}

	public void setCadusNextel(String cadusNextel) {
		this.cadusNextel = cadusNextel;
	}

	@Column(name = "cadus_telefonepessoal", length = 45)
	public String getCadusTelefonepessoal() {
		return this.cadusTelefonepessoal;
	}

	public void setCadusTelefonepessoal(String cadusTelefonepessoal) {
		this.cadusTelefonepessoal = cadusTelefonepessoal;
	}

	@Column(name = "cadus_celularpessoal", length = 45)
	public String getCadusCelularpessoal() {
		return this.cadusCelularpessoal;
	}

	public void setCadusCelularpessoal(String cadusCelularpessoal) {
		this.cadusCelularpessoal = cadusCelularpessoal;
	}

	@Column(name = "cadus_cor")
	public Integer getCadusCor() {
		return this.cadusCor;
	}

	public void setCadusCor(Integer cadusCor) {
		this.cadusCor = cadusCor;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "cadus_datacadastro", length = 19)
	public Date getCadusDatacadastro() {
		return this.cadusDatacadastro;
	}

	public void setCadusDatacadastro(Date cadusDatacadastro) {
		this.cadusDatacadastro = cadusDatacadastro;
	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "cadus_ultimaalteracao", length = 19)
	public Date getCadusUltimaalteracao() {
		return this.cadusUltimaalteracao;
	}

	public void setCadusUltimaalteracao(Date cadusUltimaalteracao) {
		this.cadusUltimaalteracao = cadusUltimaalteracao;
	}

	@Column(name = "cadus_situacao")
	public Boolean getCadusSituacao() {
		return this.cadusSituacao;
	}

	public void setCadusSituacao(Boolean cadusSituacao) {
		this.cadusSituacao = cadusSituacao;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cadastroUsuarios")
	public Set<AuxiliarUsuariospapeis> getAuxiliarUsuariospapeises() {
		return this.auxiliarUsuariospapeises;
	}

	public void setAuxiliarUsuariospapeises(
			Set<AuxiliarUsuariospapeis> auxiliarUsuariospapeises) {
		this.auxiliarUsuariospapeises = auxiliarUsuariospapeises;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cadastroUsuarios")
	public Set<AuxiliarUsuariosfiliais> getAuxiliarUsuariosfiliaises() {
		return this.auxiliarUsuariosfiliaises;
	}

	public void setAuxiliarUsuariosfiliaises(
			Set<AuxiliarUsuariosfiliais> auxiliarUsuariosfiliaises) {
		this.auxiliarUsuariosfiliaises = auxiliarUsuariosfiliaises;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cadastroUsuarios")
	public Set<CadastroAvaliacoeshistoricos> getCadastroAvaliacoeshistoricoses() {
		return this.cadastroAvaliacoeshistoricoses;
	}

	public void setCadastroAvaliacoeshistoricoses(
			Set<CadastroAvaliacoeshistoricos> cadastroAvaliacoeshistoricoses) {
		this.cadastroAvaliacoeshistoricoses = cadastroAvaliacoeshistoricoses;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cadastroUsuarios")
	public Set<AuxiliarInformativosusuarios> getAuxiliarInformativosusuarioses() {
		return this.auxiliarInformativosusuarioses;
	}

	public void setAuxiliarInformativosusuarioses(
			Set<AuxiliarInformativosusuarios> auxiliarInformativosusuarioses) {
		this.auxiliarInformativosusuarioses = auxiliarInformativosusuarioses;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cadastroUsuarios")
	public Set<CadastroEstoquehistoricos> getCadastroEstoquehistoricoses() {
		return this.cadastroEstoquehistoricoses;
	}

	public void setCadastroEstoquehistoricoses(
			Set<CadastroEstoquehistoricos> cadastroEstoquehistoricoses) {
		this.cadastroEstoquehistoricoses = cadastroEstoquehistoricoses;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cadastroUsuarios")
	public Set<CadastroInformativos> getCadastroInformativoses() {
		return this.cadastroInformativoses;
	}

	public void setCadastroInformativoses(
			Set<CadastroInformativos> cadastroInformativoses) {
		this.cadastroInformativoses = cadastroInformativoses;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cadastroUsuarios")
	public Set<AuxiliarAutomoveisdados> getAuxiliarAutomoveisdadoses() {
		return this.auxiliarAutomoveisdadoses;
	}

	public void setAuxiliarAutomoveisdadoses(
			Set<AuxiliarAutomoveisdados> auxiliarAutomoveisdadoses) {
		this.auxiliarAutomoveisdadoses = auxiliarAutomoveisdadoses;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cadastroUsuarios")
	public Set<GrupoUsuarios> getGrupoUsuarioses() {
		return this.grupoUsuarioses;
	}

	public void setGrupoUsuarioses(Set<GrupoUsuarios> grupoUsuarioses) {
		this.grupoUsuarioses = grupoUsuarioses;
	}

	@OneToMany(fetch = FetchType.LAZY, mappedBy = "cadastroUsuarios")
	public Set<CadastroSites> getCadastroSiteses() {
		return this.cadastroSiteses;
	}

	public void setCadastroSiteses(Set<CadastroSites> cadastroSiteses) {
		this.cadastroSiteses = cadastroSiteses;
	}

}

verifica o mapeamento que você fez no relacionamento Pesquise sobre Lazy

Não entendi o que vc quis dizer com relação a isso, não tenho certeza q vc entendeu o q eu quero

Por favor, ao criar tópicos, não marque-os com informações óbvias como [Dúvida]

[quote=mr.michels]verifica o mapeamento que você fez no relacionamento Pesquise sobre Lazy

http://blog.caelum.com.br/enfrentando-a-lazyinitializationexception-no-hibernate/[/quote]

mr.michels, o que eu quero mudar na minha busca é a forma que ele traz o relacionamento… no link que vc apontou ele diz:

"Nesse caso o Hibernate fará dois selects: um para pegar os dados da NotaFiscal com id 42, e outro procurando todos os items where nota_fiscal_id=42. "

o que eu preciso é de uma forma onde eu possa mudar a forma que ele busca os itens (que seria o segundo select citado) de “where nota_fiscal_id=42”,neste exemplo, para outros parâmetros que eu desejar.