【问题标题】:HQL ArrayList returning more than one type of classHQL ArrayList 返回不止一种类型的类
【发布时间】:2017-03-18 13:31:14
【问题描述】:

这不是一个“问题”,因为一切都正常工作,但令人难以置信的是它工作正常而且我找不到答案。

所以我有一些简单的休眠 HQL 查询:

 List<Comment> commentList = session.createQuery("select c, u from Comment as c, User as u where c.postRef.id = :post_id").setParameter("post_id", postId).getResultList();

当它运行时,我查看调试器,它返回 commentList,如下所示:

 - commentList - "ArrayList<E>",
   - elementData - Object[10]
     - [0] - Object[2]
         - [0] Comment
         - [1] User
     - [1] - null
     - [2] - null ... ( etc, to the end it's null)

而我就是无法理解,这ArrayList&lt;E&gt; 中怎么可能有两种类型的对象? CommentUser 在一个 ArrayList 中,我可以假设这是在创建 ArrayList 的对象或其他东西,但是这怎么可能正确地将 ArrayList&lt;Object&gt; 返回到 List&lt;Comment&gt; 而不会引发任何异常?然后我的方法也是返回类型public List&lt;Comment&gt;,我返回这个确切的commentList,一切正常。

感谢任何帮助。

【问题讨论】:

    标签: java list hibernate arraylist


    【解决方案1】:

    getResultList() 返回的每个项目都是 Object[] 类型的数组,因为查询返回两个对象 - 一个评论和一个用户。

    这在编译级别上起作用的原因是type erasure:参数化泛型的类型(例如 List)没有编译到字节码中。在字节码层面,它只是一个List,List&lt;Comment&gt;List&lt;Object[]&gt;是没有区别的。

    您应该会收到来自编译器的警告,指出该赋值

    List<Comment> commentList = session.createQuery("select c, u from Comment as c, User as u where c.postRef.id = :post_id").setParameter("post_id", postId).getResultList();
    

    不是类型安全的,即编译器不能保证 getResultList() 返回的确实是一个评论列表(在你的例子中,它实际上不是)。

    在运行时,由于类型擦除,分配有效,但您在 List 中拥有的是 Object[] 数组。

    【讨论】:

      【解决方案2】:

      您的查询返回两个对象,因此您必须使用正确的对象对每个对象进行强制转换。

      你的列表应该是这样的:

      List<Object[]> commentList = ...;
      //---^^^^^^----------------your list get an array of two Objects
      
      List<Comment> listComment = new ArrayList<>();
      List<User> listUser = new ArrayList<>();
      
      for (Object[] result : commentList){
           Comment comment = (Comment) result[0];//First object is Comment
           User user = (User) result[1]);//Second object is User
      
           listComment.add(comment);
           listUser.add(user);
      }
      

      我不了解您的实体设计,但我认为用户可以拥有一个 cmets 列表,因此您可以让它变得更好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-23
        • 2015-11-10
        • 1970-01-01
        • 2016-09-09
        • 2021-04-13
        相关资源
        最近更新 更多