Como fazer uma busca em uma entidade com 2 relacionamentos @ManyToMany[RESOLVIDO]

Boa tarde a todos, gostaria de saber se alguns de vcs poderiam me esclarecer como é feito um SELECT em uma entidade que possui dois relacionamentos @ManyToMany, não sei se estou fazendo do jeito certo, mas ao pesquisar sobre o assunto não consigo encontrar nada a respeito. segue o código:

Ocorrencia.class

@Entity
@Table(name = "OCORRENCIA")
@NamedQuery(name = "Ocorrencia.buscarOcorrenciaPorIdComEnvolvidosGuardas",
 query = "SELECT o
          FROM Ocorrencia o
          LEFT JOIN FETCH o.envolvidos     
          LEFT JOIN FETCH o.guardas 
          WHERE o.id_ocorrencia = :id_ocorrencia")    //esta é a consuta

public class Ocorrencia implements Serializable {
    private static final long serialVersionUID = 1L;
    
    public static final String BUSCAR_OCORRENCIA_POR_ID_COM_ENVOLVIDOS_E_GUARDAS = "Ocorrencia.buscarOcorrenciaPorIdComEnvolvidosGuardas";

      //Outros Atributos
    
    @ManyToMany
    private List<Envolvido> envolvidos;
    
    @ManyToMany
    private List<GuardaMunicipal> guardas;

     //Getters e Setters
}

A busca deste jeito me traz o erro:

Erro Console

FATAL:   JSF1073: java.lang.ExceptionInInitializerError obtido durante o processamento de RENDER_RESPONSE 6: UIComponent-ClientId=, Message=null
FATAL:   No associated message
java.lang.ExceptionInInitializerError
	at br.com.facade.EnvolvidoFacade.<init>(EnvolvidoFacade.java:16)
	at br.com.bean.OcorrenciaMB.<init>(OcorrenciaMB.java:41)

Caused by: javax.persistence.PersistenceException: Unable to build entity manager factory
	at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:81)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
	at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
	at br.com.dao.GenericDAO.<clinit>(GenericDAO.java:21)
	... 72 more
Caused by: org.hibernate.HibernateException: Errors in named queries: Ocorrencia.buscarOcorrenciaPorIdComEnvolvidosGuardas
	at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:544)
	at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1857)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
	at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:399)
	at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
	at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:73)
	... 75 more

Eu uso esta @NamedQuery com apenas um join e ela funciona

InstrucaoDeServico.class

@Entity
@Table(name = "INSTRUCAO_DE_SERVICO")
@NamedQuery(name = "InstrucaoDeServico.buscarInstrucaoPorIdComGMs", 
 query = "SELECT ids
          FROM InstrucaoDeServico ids 
          LEFT JOIN FETCH ids.guardas 
          WHERE ids.id_instrucao = :id_instrucao")

public class InstrucaoDeServico implements Serializable {
    
    private static final long serialVersionUID = 1L;
    
    public static final String BUSCAR_INSTRUCAO_POR_ID_COM_GMS = "InstrucaoDeServico.buscarInstrucaoPorIdComGMs";

    //Outros Atributos
    
    @JoinColumn(name = "fk_endereco", referencedColumnName = "id_endereco")
    @ManyToOne
    private Endereco cod_endereco;
    
    @ManyToMany
    private List<GuardaMunicipal> guardas;

    //Getters e Setters
}

A dúvida é como fazer o select para trazer as listas dos @ManytoMany se alguém puder ajudar desde já agradeço. :grimacing:

Acabei encontrando a solução para o meu problema não era a query que estava errada, mas sim as collections, ao pesquisar mais afundo sobre o assunto descobri que estava acontecendo o erro pelo motivo das minhas collections serem do tipo java.util.List.

Collections

@ManyToMany
private List<Envolvido> envolvidos;
    
@ManyToMany
private List<GuardaMunicipal> guardas;

e ao fazer o SELECT as collections estavam retornando resultados duplicados. O java.util.List, se trata de uma lista desordenada, que pode retornar valores duplicados. Por causa disso obtive o erro:

org.hibernate.loader.MultipleBagFetchException: cannot simultaneously fetch multiple bags

Resolvi o problema trocando o java.util.List pelo java.util.Set, que assim como o List se trata de uma lista desordenada, mas com a diferença de não retornar valores duplicados.

O Relacionamento ficou da seguinte maneira:

Collections

@ManyToMany
private Set<Envolvido> envolvidos;
    
@ManyToMany
private Set<GuardaMunicipal> guardas;

Assim como o List é uma interface e o ArrayList é sua implementação, o Set e HashSet seguem a mesma analogia, onde o Set é a interface e o HashSet é sua implementação.

No caso de uma instanciação do tipo Set ficaria assim:

Set<Envolvido> envolvidos = new HashSet<Envolvido>();

Eu quis fazer essa mini explicação aqui porque sou iniciante eu tive um pouco de dificuldade para encontrar essa solução. Vou deixar essas informações aqui para ajudar outros, que, assim como eu possam encontrar essa dificuldade. Vlw! :sunglasses: