【问题标题】:Fetching specific columns using list() hibernate使用 list() hibernate 获取特定列
【发布时间】:2026-01-14 04:15:01
【问题描述】:

我有Hibernatecriteria查询如下:

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

现在我有 criteriaListObject 两列数据 MonthYear。我想将criteriaList 中的查询结果仅列出MonthList<Integer>

我尝试循环遍历criteriaList 并将获取的Object 转换为List<Integer>,但没有成功。我怎样才能从返回的两列中只获取第一列(Month)

注意:将投影设置为仅一列 (Month) 将无济于事,因为我需要在 MonthYear 上都不同

更新:

我使用过以下类型:

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

由于返回的月份数会有所不同,我想将获取的月份添加到 List&lt;Integer&gt; 以执行进一步的操作。

【问题讨论】:

    标签: java hibernate hql criteria


    【解决方案1】:

    当使用如图所示的ProjectionList 时,休眠在criteria.list() 上返回List&lt;Object[]&gt;。在您的情况下,对象数组的第一个元素(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。

    编辑

    在您提供有关您的 cmets 的更多信息后,我刚刚编辑了我建议的块。

    【讨论】:

    • 谢谢。你能根据我更新的问题提出一些建议吗?
    • Test.class 中的month 属性是什么类型?
    • 我明白了,将月份列表的类型更改为List&lt;BigDecimal&gt; Month = Collections.emptyList();,但在将row[0] 添加到Month 时,我得到UnsupportedOperationException
    • 好吧,尝试在时间变量中转换为BigDecimal,然后转换为Integer 以添加到列表中。看到这个转换*.com/questions/4043579/…
    • 但是当我在criteria.list()它的对象中获取值时,如果我循环通过Object[],我可以不直接将它添加到list,当然是在转换Integer之后给它?