2017-03-18 70 views
-2

这不是一个“问题”,因为一切工作正常,但它真的令人难以置信,它工作正常,我无法找到答案。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>中有什么可能有两种类型的对象? CommentUser在一个ArrayList中,我可以假设这是创建对象的东西ArrayList,但是这怎么可能返回ArrayList<Object>List<Comment>没有抛出任何异常?然后我的方法也是返回类型public List<Comment>,我返回这个确切的commentList,并且一切正常工作。

感谢任何帮助。

回答

0

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[]阵列。

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

我不知道你的实体设计,但我认为用户可以评论的列表,所以你可以做的更好,然后这个。