这不是问题"因为一切都运转正常,但是它工作正常并且无法找到答案真的令人难以置信。
所以我有一些简单的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
中的User
和ArrayList
都在ArrayList
,我可以假设这是创建ArrayList<Object>
个对象或其他东西,但那么它如何返回{{1}正确到List<Comment>
而不抛出任何异常?然后我的方法也是返回类型public List<Comment>
,我返回这个确切的commentList
,一切都运行得很好。
感谢任何帮助。
答案 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[]
数组。