使用 list() hibernate 获取特定列

Fetching specific columns using list() hibernate

我有 Hibernate criteria 查询如下:

Criteria criteria = session.createCriteria(Test.class);
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("Month"));
projList.add(Projections.property("Year"));
criteria.setProjection(Projections.distinct(projList));

我在这里尝试使用类似于

的月份和年份来获取不同的值

select distinct Month, Year from table;

最后,在完成查询后,我使用 list() 获取条件为:

criteriaList = criteria.list();

现在我有 criteriaList 作为 Object 和两列数据 MonthYear。我想将 criteriaList 中的查询结果仅 Month 列出到 List<Integer>.

我试过遍历 criteriaList 并将获取的 Object 转换为 List<Integer>,但没有成功。如何仅从返回的两列中获取第一列 (Month)?

注意: 将投影设置为仅一列 (Month) 无济于事,因为我需要在 MonthYear[= 上区分31=]

更新:

我用过以下类型:

List<Object[]> criteriaList = Collections.emptyList();
List<Integer> Month = Collections.emptyList();

并且由于返回的月数会有所不同,我想将获取的月份添加到 List<Integer> 中以执行进一步的操作。

如您所示使用 ProjectionList 时,请在 criteria.list() 上休眠 returns List<Object[]>。在您的例子中,对象数组第一个元素(0 索引)是月份,第二个元素(1 索引)是年份。

所以你必须处理一个对象数组列表,如下:

List<Object[]> criteriaList = criteria.list();
List<Integer> monthList = Collections.emptyList();

for (Object[] row : criteriaList) {
    try{
        BigDecimal month = row[0];
        monthList.add(month.intValueExact());
    catch(Exception e){
        //To deal with casting Exception, NPE and 
        //ArithmeticException if int conversion fails
    }

    //Do what you want ...
}

当然,我假设 Projections.property("Month") 是一个 Integer 对象,但我不知道,所以你必须正确转换。 Year.

也一样

当然你也可以使用resultTransformer

编辑

在你提供更多关于评论的信息后,我刚刚编辑了我建议的区块。