HQL ArrayList返回多个类的类型
问题描述:
这不是一个“问题”,因为一切工作正常,但它真的令人难以置信,它工作正常,我无法找到答案。HQL ArrayList返回多个类的类型
所以我有一些简单的休眠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>
到List<Comment>
没有抛出任何异常?然后我的方法也是返回类型public List<Comment>
,我返回这个确切的commentList
,并且一切正常工作。
感谢任何帮助。
答
getResultList()
返回的每个项目都是Object []类型的数组,因为查询返回两个对象 - 一个Comment和一个User。
在编译级别上工作的原因是type erasure:诸如List之类的参数化泛型的类型未编译到字节代码中。在字节码级别,它只是一个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[]
阵列。
答
您的查询返回两个对象,因此您必须使用正确的对象来转换每个对象。
您的名单应该是这样的:
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);
}
我不知道你的实体设计,但我认为用户可以评论的列表,所以你可以做的更好,然后这个。