Java 8 Hibernate Streams Criteria groupingBy擦除类型?

时间:2015-02-19 00:21:27

标签: java hibernate java-8 java-stream type-erasure

我试图更多地使用Java 8 beautiful&& amp;精彩的API。

这是我的代码

private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
    final Criteria criteria = currentSession().createCriteria(Student.class) 
    .setMaxResults(10);        
    return (Map<String,List<Student>>)criteria.list()
   .stream()
   .collect(Collectors.groupingBy(Student::getSingle));    
}

这很有用,我很乐意做这样的事情......

private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
    return currentSession().createCriteria(Student.class) 
    .setMaxResults(10)        
    .list()
   .stream()
   .collect(Collectors.groupingBy(Student::getSingle));    
}

但是出现编译错误

 incompatibles types Object cannot be cast to Map<String,List<Student>>

我知道这与编译时的擦除类型有关,请在此时纠正我....

这似乎有效

private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
    final List<Student> students = currentSession().createCriteria(Student.class) 
    .setMaxResults(10);        
    .list();
   students.stream()
   .collect(Collectors.groupingBy(Student::getSingle));    
}

我的问题是我是否已经知道Hibernate返回的集合的类型

currentSession().createCriteria(Student.class) 

有一些方法可以做到

private final Map<String,List<Student>>getStudentsAsStreamAndCollect()
{
    return currentSession().createCriteria(Student.class) 
    .setMaxResults(10);        
    .list()
   .stream()
   .collect(Collectors.groupingBy(Student::getSingle));    
}

或者不可能?来自委内瑞拉的最好的问候任何帮助都非常感谢。

1 个答案:

答案 0 :(得分:1)

如果Criteria.list()的返回类型被声明为没有类型的原始类型List,那么知道Hibernate返回的集合的类型没有帮助参数,编译器不知道。

无论您使用哪种方法,都至少涉及一次未经检查的操作。

您最好的变体是将List分配给List<Student>的变体,因为未经检查的操作发生在API强制您到达的位置通过将Criteria.list()的结果从List转换为List<Student>来执行此操作。然后,所有后续操作都可以执行类型安全(假设您的列表包含Student实例的断言是正确的。)

请注意,这与类型擦除无关,只是原始类型使用。没有要删除的类型信息,因为Criterion类首先没有通用类型信息。