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?
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
`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);
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);