java - 将 HQL 结果汇总到列表中

标签 java oracle hibernate

我想使用条件对一些 SQL 数据进行分组。让我们从看起来像这样的实体开始:

class CityEntity {
    private String name;
    private Date lastVisited;
}

我想要做的是找到所有城市并在变压器中返回结果:

class CityTransformer {
    private String name;
    private List<Date> lastVisited;
}

如您所见,sql 结果应按名称分组并将日期放入列表中。

我想使用标准来做到这一点,所以它看起来几乎像这样:

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

问题是我不知道如何将日期(lastVisited)聚合到列表中。有什么帮助吗?

例如,输入将如下所示(名称,lastVisited):

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

输出应该如下所示

[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;

关于java - 将 HQL 结果汇总到列表中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25847186/

相关文章:

java - LocalSessionFactoryBean 无法作为 SessionFactory 注入(inject)

java - 如何处理一个表的外键映射到多个表的主键?

java - 为 Java 进程提供某种签名/标识符

sql - 像命令不工作 Oracle SQL

sql - 分层查询/基于表输入

sql - 根据结果​​计数拆分查询结果

eclipse - gwt hibernate 程序中的异常

java - 如何获取内网访问者的windows用户名

java - Java7 垃圾优先收集器如何工作?

java - 分离正则表达式中的突发部分