Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将HQL结果聚合到列表_Java_Oracle_Hibernate - Fatal编程技术网

Java 将HQL结果聚合到列表

Java 将HQL结果聚合到列表,java,oracle,hibernate,Java,Oracle,Hibernate,我想使用条件对一些sql数据进行分组。让我们从实体开始,它看起来大致如下: class CityEntity { private String name; private Date lastVisited; } Criteria criteria = session.createCriteria(CityEntity.class, "ce"); criteria.setProjection(Projections.projectionList().add(Projections

我想使用条件对一些sql数据进行分组。让我们从实体开始,它看起来大致如下:

class CityEntity {
    private String name;
    private Date lastVisited;
}
Criteria criteria = session.createCriteria(CityEntity.class, "ce");
criteria.setProjection(Projections.projectionList().add(Projections.groupProperty("name"), "name"));
criteria.setResultTransformer(Transformers.aliasToBean(CityTransformer.class));
List<CityTransformer> cities = criteria.list();
我要做的是查找所有城市并在Transformer中返回结果:

class CityTransformer {
    private String name;
    private List<Date> lastVisited;
}
输出应该是这样的

[LosAngeles, list[10-11-2014, 11-12-2011, 10-01-2011]],
[Berlin, list[01-10-2011]]

您不需要为此进行SQL分组。您可以使用Java对其进行分组:

Criteria criteria = session.createCriteria(CityEntity.class, "ce");
criteria.setProjection(
        Projections.projectionList()
                .add( Projections.property("ce.name"), "ceName" )
                .add( Projections.property("ce.lastVisited"), "ceLastVisited" )
);
List<Object[]> citiesAndDates = (List<Object[]>) criteria.list();
Map<String, CityTransformer> cityTransformerMap = new HashMap<String, CityTransformer>();
for(Object[] citiesAndDate : citiesAndDates) {
    String city = (String) citiesAndDate[0];
    Date date = (Date) citiesAndDate[1];
    CityTransformer cityTransformer = cityTransformerMap.get(city);
    if(cityTransformer == null) {
        cityTransformer = new CityTransformer();
        cityTransformerMap.put(city, cityTransformer);
    }
    cityTransformer.getLastVisited().add(date);
}
return cityTransformerMap;

是的,我知道,但如果可能的话,我不想创建这个样板代码。Hibernate可以将sql结果聚合到对象,所以为什么不能以相同的方式将结果聚合到transformer?Hibernate可以构建实体关系图,但不能基于投影数据。项目以一对一的方式映射到DTO。
Criteria criteria = session.createCriteria(CityEntity.class, "ce");
criteria.setProjection(
        Projections.projectionList()
                .add( Projections.property("ce.name"), "ceName" )
                .add( Projections.property("ce.lastVisited"), "ceLastVisited" )
);
List<Object[]> citiesAndDates = (List<Object[]>) criteria.list();
Map<String, CityTransformer> cityTransformerMap = new HashMap<String, CityTransformer>();
for(Object[] citiesAndDate : citiesAndDates) {
    String city = (String) citiesAndDate[0];
    Date date = (Date) citiesAndDate[1];
    CityTransformer cityTransformer = cityTransformerMap.get(city);
    if(cityTransformer == null) {
        cityTransformer = new CityTransformer();
        cityTransformerMap.put(city, cityTransformer);
    }
    cityTransformer.getLastVisited().add(date);
}
return cityTransformerMap;