如何使用grails 2.5.0中的where子句返回表中值的总和

时间:2015-07-31 16:20:46

标签: sql grails

域类:

class Transaction {
   String roundId
   BigDecimal amount
   :
}

我们希望执行以下SQL:

"从交易t中选择总和(t.amount),其中t.roundId = xxx"

我们无法找到不返回事务行的示例。

我们假设有两种方法:

  1. 使用预测和/或标准等?我们发现的所有示例都只返回事务行的列表,而不是总和。
  2. 使用原始SQL。我们如何调用SQL,并获得它返回的BigDecimal的句柄?
  3. 我试过了:

    class bla{
    def sessionFactory
    def someMethod() {
        def SQLsession = sessionFactory.getCurrentSession()
        def results = SQLsession.createSQLQuery("select sum(t.credit) from transaction t where t.round_id = :roundId", [roundId: roundId])
    

    但是

    失败了
    groovy.lang.MissingMethodException: No signature of method: org.hibernate.internal.SessionImpl.createSQLQuery() is applicable for argument types: (java.lang.String, java.util.LinkedHashMap)
    

    另外,我不知道返回类型是什么(无法​​找到任何文档)。我猜这将是一个列表:数组?地图吗?

    ====更新====

    找到一种有效的方法(不是很优雅或像grails一样)

        def SQLsession = sessionFactory.getCurrentSession()
        final query = "select sum(t.credit) from transaction t where t.round_id = :roundId"
        final sqlQuery = SQLsession.createSQLQuery(query)
        final results = sqlQuery.with {
            setString('roundId', roundId)
            list()  // what is this for?  Is there a better return value?
        }
    

    这似乎返回一个数组,而不是预期的列表,所以我可以这样做:

    if (results?.size == 1) {
        println results[0] // outputs a big decimal
    }
    

    奇怪的是,results.length失败了,但results.size有效。

2 个答案:

答案 0 :(得分:1)

使用Criteria,您可以

Transaction.withCriteria {
    eq 'roundId', yourRoundIdValueHere
    projections {
        sum 'amount'
    }
}

答案 1 :(得分:1)

https://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/classic/Session.html

 Query  createSQLQuery(String sql, String[] returnAliases, Class[] returnClasses) 
 Query  createSQLQuery(String sql, String returnAlias, Class returnClass) 

createSQLQuery的第二个参数是一个或多个returnAliases,并不意味着将语句绑定到值。

不要在第二个参数中传递您的值,而是使用Query object的设置者,即setStringsetInteger等。

results.setInteger('roundId',roundId);