Query customizada JPA Netbeans

Bom dia.

Estou tentando utilizar JPA em alguns testes simples e me deparei com a necessidade de fazer uma query requisitando valores de 3 tabelas sendo duas (Utilizador e Recurso) e outra de relacionamento (Utilizador_Recurso).

A query é esta:

select u.id, u.nome, r.descricao from utilizador u, recurso r, utilizador_descricao ud where u.id = ud.id_utilizador and r.id = ud.id_recurso

Estou tentando utilizar o TypedQuery por ser um exemplo que encontrei na Net mas não funcionou:

`String queryStr = “select u.id, u.nome, r.descricao from utilizador u, recurso r, utilizador_descricao ud where u.id = ud.id_utilizador and r.id = ud.id_recurso”;

    TypedQuery <UtilizadoreRecurso> t = em.createQuery(queryStr, UtilizadoreRecurso.class);
    List<UtilizadoreRecurso> results = t.getResultList();`

[7, 11] The state field path 'u.id' cannot be resolved to a valid type. [13, 19] The state field path 'u.nome' cannot be resolved to a valid type. [21, 32] The state field path 'r.descricao' cannot be resolved to a valid type. [38, 48] The abstract schema type 'utilizador' is unknown. [52, 59] The abstract schema type 'recurso' is unknown. [63, 83] The abstract schema type 'utilizador_descricao' is unknown.

Alguem saberia me dizer se esta é a melhor forma? Qual seria a forma correta de se obter este resultado?

grato

`tenta isso:
select u.id, u.nome, r.descricao from Utilizador u join u.recursos as r where u.id=idUtilizador and r.id=idRecurso

`

Olá Luciano!

Fiz o teste substituindo a query mas o erro persiste:

Exception in thread "main" java.lang.IllegalArgumentException: An exception occurred while creating a query in EntityManager: Exception Description: Problem compiling [select u.id , u.nome , r.descricao from Utilizador u join u.recursos as r where u.id=idUtilizador and r.id=idRecurso]. [21, 32] The state field path 'r.descricao' cannot be resolved to a valid type. [56, 66] The collection-valued path 'u.recursos' cannot be resolved to a valid association field. [78, 82] The basic mapping 'u.id' cannot be used in conjunction with the = operator. [102, 106] The state field path 'r.id' cannot be resolved to a valid type. [85, 97] The identification variable 'idUtilizador' is not defined in the FROM clause. [109, 118] The identification variable 'idRecurso' is not defined in the FROM clause. at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1605) at org.eclipse.persistence.internal.jpa.EntityManagerImpl.createQuery(EntityManagerImpl.java:1625) at testcirculo.QueryCustom.main(QueryCustom.java:33)

Minhas tabelas estão assim:

utilizador
id
nome

recurso
id
descricao

utilizador_recurso
id_utilizador
id_recurso

Fiz um ajuste na query que você passou mas não entendi a utilização do u.recurso.

select u.id , u.nome , r.descricao from Utilizador u join u.recurso as r where u.id=id_utilizador and r.id=id_recurso

E o erro persiste.

`recursos é uma lista que está no utilizador por isso vc deve fazer o join,
coloca isso u.id=:idUtilizador and r.id=:idRecurso

TypedQuery t = em.createQuery(queryStr, UtilizadoreRecurso.class);
t.setParameter(“idUtilizador” , aqui vai o parametro do id do utilizador);
t.setParameter(“idRecurso” , aqui vai o parametro do id do recurso);

List results = t.getResultList();`

`

Olá Luciano. Aparentemente funcionou…

Eu estou tentando recuperar o valor usando o tipo no List mas ele não deixa fazer o Cast.

List <UtilizadoreRecurso> results = t.getResultList();

A unica forma de receber isso seria em uma lista sem tipo?

grato novamente…

tenta isso: return t.getResultList( );

Eu criei uma nova classe com um metodo que retorna a List . Seria isso?

Se sim ele cai no mesmo problema

`public class GetListUtilizadorRecurso {

public static List<UtilizadoreRecurso> findUtilizadorRecurso() {
    
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("TestCirculoPU");
    EntityManager em = emf.createEntityManager();
    
    String queryStr = "select u.id, u.nome, r.descricao from Utilizador u join u.recursoCollection as r";
    TypedQuery <UtilizadoreRecurso> t = em.createQuery(queryStr, UtilizadoreRecurso.class);
    
            
    return t.getResultList();
}

}`

Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to testcirculo.UtilizadoreRecurso

tira o TypedQuery e deixa so Query

Na Instrução usando somente Query, eu não posso passar um tipo

Query <UtilizadoreRecurso> t = em.createQuery(queryStr, UtilizadoreRecurso.class);

Quando acerto a sintaxe para:

Query t = em.createQuery(queryStr, UtilizadoreRecurso.class);

O erro persiste: Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to testcirculo.UtilizadoreRecurso

O erro ocorre quando faço um for na tentativa de ler o objeto List:

for (int i = 0; i < GetListUtilizadorRecurso.findUtilizadorRecurso().size(); i++) {
    System.out.println("ID " + GetListUtilizadorRecurso.findUtilizadorRecurso().get(i).getIdUser());
}

Na tua query não estas a devolver um Objeto do tipo UtilizadorRecurso mas sim uma lista de objetos (com u.id, u.nome e r.descricao)

O que tu deves querer deve ser algo como isto:

String queryStr = "select r from Utilizador u join u.recursoCollection as r" ; 
TypedQuery <UtilizadoreRecurso> t = em.createQuery(queryStr, UtilizadoreRecurso.class);