2015-01-25 3 views
1

Как я могу преобразовать этот 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; 

У меня есть класс Item, как:

@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); 
    } 

Когда я запустил запрос, у меня была ошибка:

ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ERROR: column "category" does not exist 

Я пытаюсь переключить категорию на cat_id или владельца на owner_id (установить параметр owner.getId()), но это тоже не помогает.

+1

Используйте псевдоним, как 'Выберите сумму (item.amount), item.category, месяц (item.createOn) как пн, год (item.createOn) как год с пункта item item item.owner =: группа владельца по item.category, mon, year'. (Позже, отбросьте 'FetchType.EAGER' и используйте другие схемы, такие как объединения fetch). – Tiny

+0

Спасибо, я попробовал вам запрос, но он жаловался, что мне нужно иметь item.category.id в группе. Поэтому я исправил это, изменив item.category -> item.category.id в Select и Group by. Результат увлечен. Благодарим за ваше предложение. –

ответ

0

Вам необходимо изменение уплотнительное 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"); 
Смежные вопросы