java JPA 本机查询连接返回对象但取消引用引发类转换异常
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/4536655/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
JPA native query join returns object but dereference throws class cast exception
提问by Meow
I'm using JPQL Native query to join table and query result is stored in List<Object[]>
.
我正在使用 JPQL Native 查询来连接表,并且查询结果存储在List<Object[]>
.
public String getJoinJpqlNativeQuery() {
String final SQL_JOIN =
"SELECT v1.bitbit, v1.numnum, v1.someTime, t1.username,
t1.anotherNum FROM MasatosanTest t1
JOIN MasatoView v1 ON v1.username = t1.username;"
System.out.println("get join jpql native query is being called
============================");
EntityManager em = null;
List<Object[]> out = null;
try {
em = EmProvider.getDefaultManager();
Query query = em.createNativeQuery(SQL_JOIN);
out = query.getResultList();
System.out.println("return object ==========>" + out);
System.out.println(out.get(0));
String one = out.get(0).toString(); //LINE 77 where ClassCastException
System.out.println(one);
}
catch(Exception e) {
}
finally {
if(em != null) { em.close; }
}
}
The problem is
问题是
System.out.println("return object ==========>" + out);
outputs:
System.out.println("return object ==========>" + out);
输出:
return object ==========>
[[true, 0, 2010-12-21 15:32:53.0, masatosan, 0.020],
[false, 0, 2010-12-21 15:32:53.0, koga, 0.213]]
System.out.println(out.get(0))
outputs:
System.out.println(out.get(0))
输出:
[true, 0, 2010-12-21 15:32:53.0, masatosan, 0.020]
So I assumed that I can assign return value of out.get(0) which should be String:
所以我假设我可以分配 out.get(0) 的返回值,它应该是字符串:
String one = out.get(0).toString();
But I get weird ClassCastException.
但是我得到了奇怪的 ClassCastException。
java.lang.ClassCastException: java.util.Vector cannot be cast to
[Ljava.lang.Object;
at local.test.jaxrs.MasatosanTestResource.getJoinJpqlNativeQuery
(MasatosanTestResource.java:77)
So what's really going on? Even Object[] foo = out.get(0);
would throw an ClassCastException :(
那么到底发生了什么?甚至Object[] foo = out.get(0);
会抛出 ClassCastException :(
采纳答案by LazyCubicleMonkey
I'm not familiar with JPQL Native query, but you simply debug with:
我不熟悉 JPQL Native 查询,但您只需调试:
Object o = out.get(0); System.out.println(o.getClass());
对象 o = out.get(0); System.out.println(o.getClass());
Then work from there. If it's a vector, iterate through and find what's in the vector.
然后从那里开始工作。如果它是一个向量,则遍历并找到向量中的内容。
回答by Nayan Wadekar
The SELECT clause queries more than one column or entity, the results are aggregated in an object array (Object[]) in the java.util.List returned by getResultList( ).
SELECT 子句查询多个列或实体,结果聚合在 getResultList( ) 返回的 java.util.List 中的对象数组 (Object[]) 中。
//---
Query query = manager.createQuery("SELECT v1.bitbit, v1.numnum, v1.someTime, t1.username, t1.anotherNum FROM MasatosanTest t1 JOIN MasatoView v1 ON v1.username = t1.username;");
List results = query.getResultList( ); // Fetches list containing arrays of object
Iterator it = results.iterator( );
while (it.hasNext( )) {
Object[] result = (Object[])it.next(); // Iterating through array object
Boolean first = (Boolean) result[0]; // Fetching the field from array
/* Likewise for all the fields, casting accordingly to the sequence in SELECT query*/
}
//---
Edit :To avoid casting explicitly, you can go for constructor expression, adding a constructor to the entity with appropriate arguments.
编辑:为避免显式转换,您可以使用构造函数表达式,使用适当的参数向实体添加构造函数。
SELECT new org.somepackage.XEntity(x.a, x.b) FROM XEntity x