HQL ArrayList返回多种类型的类

时间:2017-03-18 13:31:14

标签: java list hibernate arraylist

这不是问题"因为一切都运转正常,但是它工作正常并且无法找到答案真的令人难以置信。

所以我有一些简单的hibernate 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<E>中有两种类型的对象怎么可能? Comment中的UserArrayList都在ArrayList,我可以假设这是创建ArrayList<Object>个对象或其他东西,但那么它如何返回{{1}正确到List<Comment>而不抛出任何异常?然后我的方法也是返回类型public List<Comment>,我返回这个确切的commentList,一切都运行得很好。

感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

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

你的清单应该是这样的:

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);
}

我不了解您的实体设计,但我认为用户可以拥有评论列表,因此您可以做得更好。

答案 1 :(得分:0)

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

这在编译级别上工作的原因是type erasure:参数化通用的类型(如List)不会编译为字节代码。在字节代码级别,它只是一个列表,List<Comment>List<Object[]>无法区分。

您应该收到编译器发出的分配

的警告
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[]数组。