Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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 按分组的Hibernate查询_Java_Sql_Database_Hibernate_Hql - Fatal编程技术网

Java 按分组的Hibernate查询

Java 按分组的Hibernate查询,java,sql,database,hibernate,hql,Java,Sql,Database,Hibernate,Hql,如何将此postgreSql查询转换为hibernate查询: select sum(amount), cat_id, date_trunc('month', createOn) as month, date_trunc('year', createOn) as year from item where owner_id = 1 group by cat_id , month, year; 我的项目类别为: @Column(name="AMOUNT") pr

如何将此postgreSql查询转换为hibernate查询:

select sum(amount), cat_id, 
       date_trunc('month', createOn) as month,
       date_trunc('year', createOn) as year 
from item 
where owner_id = 1 
group by cat_id , month, year;
我的项目类别为:

@Column(name="AMOUNT")
private BigDecimal amount;

@ManyToOne
@JoinColumn(name="OWNER_ID")
private Customer owner;


@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="CAT_ID")
private Category category;

@Temporal(TemporalType.DATE)
@Column(name="CREATEON")
private Date createOn;
我已尝试将其转换为:

StringBuffer hql = new StringBuffer()
        .append("Select sum(amount), category, month(createOn) as mon, year(createOn) as year")
        .append(" from Item")
        .append(" where owner=:owner")
        .append(" group by category, mon, year");

    Query query = getQuery(hql.toString())
                    .setParameter("owner", owner);   

    List<Object[]> resultList = query.list();
    List<BundleHolder> bundleHolderList = new ArrayList<BundleHolder>();

    for(Object[] result : resultList) {
        BundleHolder instance = BundleHolder.getInstance();
        instance.setAmount((BigDecimal) result[0]);
        instance.setCategory((Category) result[1]);
        instance.setMonth((int) result[2]);
        instance.setYear((int) result[3]);

        bundleHolderList.add(instance);
    }

我尝试将category切换到cat\u id,或将owner切换到owner\u id(将参数设置为owner.getId()),但也没有帮助。

您需要将
category
更改为
category.id

StringBuffer hql = new StringBuffer()
        .append("Select sum(amount), category.id, month(createOn) as mon, year(createOn) as year")
        .append(" from Item")
        .append(" where owner=:owner")
        .append(" group by category.id, mon, year");

使用类似于
的别名,从项目中选择sum(item.amount)、item.category、month(item.createOn)作为mon、year(item.createOn)作为year,其中item.owner=:owner group by item.category、mon、year
。(稍后,删除
FetchType.EAGER
,并使用其他方案,如fetch join)。谢谢,我尝试了您的查询,但它抱怨我需要在group by中包含item.category.id。因此,我通过在“选择和分组依据”中更改item.category->item.category.id来修复它。结果令人着迷。谢谢你的建议。
StringBuffer hql = new StringBuffer()
        .append("Select sum(amount), category.id, month(createOn) as mon, year(createOn) as year")
        .append(" from Item")
        .append(" where owner=:owner")
        .append(" group by category.id, mon, year");