【问题标题】:JPA native query join returns object but dereference throws class cast exceptionJPA本机查询连接返回对象但取消引用抛出类转换异常
【发布时间】:2011-05-31 00:22:28
【问题描述】:

我正在使用 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; }
            }
}

问题是

System.out.println("return object ==========&gt;" + 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)) 输出:

[true, 0, 2010-12-21 15:32:53.0, masatosan, 0.020]

所以我假设我可以分配 out.get(0) 的返回值,它应该是 String:

String one = out.get(0).toString();

但是我得到了奇怪的 ClassCastException。

java.lang.ClassCastException: java.util.Vector cannot be cast to 
[Ljava.lang.Object;
        at local.test.jaxrs.MasatosanTestResource.getJoinJpqlNativeQuery
(MasatosanTestResource.java:77)

那么到底发生了什么?即使Object[] foo = out.get(0); 也会抛出 ClassCastException :(

【问题讨论】:

    标签: java sql jpa jpql


    【解决方案1】:

    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*/
    
        }
    
        //---
    

    编辑: 为避免显式转换,您可以使用构造函数表达式,将构造函数添加到具有适当参数的实体。

    SELECT new org.somepackage.XEntity(x.a, x.b) FROM XEntity x
    

    【讨论】:

    • 相应地编辑了我的答案,可能会对你有所帮助。
    【解决方案2】:

    我不熟悉 JPQL Native 查询,但您只需调试:

    对象 o = out.get(0); System.out.println(o.getClass());

    然后从那里开始工作。如果是向量,则遍历并找出向量中的内容。

    【讨论】:

    • 谢谢!不知道怎么用getClass()方法,棒棒哒
    • instanceof 怎么样?如果 instanceof Vector 则转换它。
    猜你喜欢
    • 2019-03-27
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    相关资源
    最近更新 更多