Intentemos lo siguiente, ejecutemos la query nativa, es decir, SQL no JPQL. Primero, necesitamos envolver los resultados de las dos tablas y nos apoyaremos en
@SqlResultSetMapping:
@SqlResultSetMapping(name="UsuarioCuestionarioResults",
entities={
@EntityResult(entityClass=tu.paquete.Usuario.class)
@EntityResult(entityClass=tu.paquete.Cuestionario.class)
}
)
...
}
donde,
name es el indentificador. El conjunto
entities especifica las clases (tablas) que devolverá la consulta nativa, que son 2: usuarios y cuestionarios.
Ahora, procedemos a llamarlo:
String queryStr
= "SELECT u.nombre, c.nombre FROM usuarios u, cuestionarios c, INNER JOIN usuarios_cuestionarios uc ON uc.id_usuario = u.id_usuario,
INNER JOIN uc.id_cuestionario = c.id_cuestionario
WHERE c.id = 2";
Query q = em.createNativeQuery(queryStr, "UsuarioCuestionarioResults");
List<Object[]> results = (List<Object[]>) q.getResult();
for(Object[] record
= results
) { Usuario u = (Usuario) record[0];
Cuestionario c = (Cuestionario)[1];
// hacer algo
}
Como ves, llamamos al ResultSetMapping por su identificador. Las nativeQueries devuelven arreglos de objetos, éstos, dependen de las clases (tablas) que devuelve la consulta. Por eso, cada ítem de la lista devuelta, tendrá 2 clases ya mapeadas: Usuario y Cuestionario.
Ahora ya podrás mostrar los datos.
PD: Posiblemente hayan errores, pero serán mínimos, en ese caso, sería bueno que busques también por tu cuenta.