域类:
class Transaction {
String roundId
BigDecimal amount
:
}
我们希望执行以下SQL:
"从交易t中选择总和(t.amount),其中t.roundId = xxx"
我们无法找到不返回事务行的示例。
我们假设有两种方法:
我试过了:
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有效。
答案 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的设置者,即setString
,setInteger
等。
results.setInteger('roundId',roundId);