2011-01-31 2 views
2

У меня есть доменGrails вычисляемое поле в SQL

class InvoiceLine { 

String itemName 
BigDecimal unitCost 
Integer quantity 
} 

}

Я хотел бы придумать укупорочное Grails с использованием .withCriteria, что делает агрегацию (unitCost * количество), так что Я в конечном итоге с SQL

select item_name, sum(unit_cost * quantity) from invoice_line group by item_name; 

сейчас, лучшее, что я мог придумать это

def result = InvoiceLine.withCriteria { 

     projections { 
      groupProperty('itemName') 
      sum ('quantity * unitCost') 
     } 
    } 

К сожалению, грайль задыхается, когда я запускаю код выше. Кто-нибудь знает, как я могу достичь своей цели? Любая помощь высоко ценится.

+0

Вот хороший ответ [Grails проекция на арифметическое выражение с ExecuteQuery()?] (http://stackoverflow.com/a/7652787/1049542) – stokito

ответ

1

Нужно ли быть критериям запроса? HQL прекрасно работает здесь:

def result = InvoiceLine.executeQuery(
    "select itemName, sum(unitCost * quantity) " + 
    "from InvoiceLine " + 
    "group by itemName") 

Результаты будут List из Object[], где первый элемент является строка (имя), и второй ряд (сумма), так, например, вы могли бы итерацию с чем-то как

results.each { row -> 
    println "Total for ${row[0]} is ${row[1]}" 
} 
+0

Благодаря Берт. Ну, я думал, что могу использовать «чисто грабли». Guess HQL, вероятно, придется сделать сейчас. Еще раз спасибо. – mackelkin

+0

HQL через executeQuery - это не менее «чистый Grails», чем критерии запросов - оба обертывают стандартную базовую функциональность Hibernate. Делайте то, что работает. –

Смежные вопросы