我想执行一个sql语句并将结果返回给Grails中的视图。为了澄清,我没有尝试返回域对象并在视图上显示它们。我有一个简单的查询,我正在加入两个表,我只想将结果传递给视图进行显示。
以下是我视图中的代码:
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<meta name='layout' content='main'/>
<title></title>
</head>
<body>
<div id = 'overall'>
<g:if test="${queryResultMap.size() > 0}">
<table border="1">
<thead>
<tr>
<th>Banner ID</th>
<th>PIDM</th>
<th>Term</th>
<th>Processed Indicator</th>
</tr>
</thead>
<tbody>
<g:each in="${queryResultMap}" status="i" var="thisRecord">
<tr>
<td>${thisRecord.SPRIDEN_ID}</td>
<td>${thisRecord.SFRWDRL_PIDM}</td>
<td>${thisRecord.SFRWDRL_TERM_CODE}</td>
<td>${thisRecord.SFRWDRL_PROCESSED_IND}</td>
</tr>
</g:each>
</tbody>
</table>
</g:if>
<g:else>
No records were found to update.
</g:else>
</div>
</body>
</html>
以下是我的控制器中的代码:
//Create our database connection...
Sql sqlStatement = new Sql(dataSource)
//Here is my simple query
def sqlString =
"SELECT S.SPRIDEN_ID, " +
"D.SFRWDRL_PIDM, " +
"D.SFRWDRL_PROCESSED_IND, " +
"D.SFRWDRL_USER, " +
"D.SFRWDRL_USER_ID, " +
"D.SFRWDRL_ACTIVITY_DATE, " +
"D.SFRWDRL_TERM_CODE " +
"FROM SATURN.SPRIDEN S, SATURN.SFRWDRL D \n" +
"WHERE S.SPRIDEN_PIDM = \'" + pidm + "\' " +
"AND S.SPRIDEN_CHANGE_IND IS NULL " +
"AND S.SPRIDEN_PIDM = D.SFRWDRL_PIDM " +
"AND D.SFRWDRL_TERM_CODE = '" + term + "\' "
def returnList = []
//Put out query results into the queryResults array...
sqlStatement.eachRow(sqlString){
returnList << it.toRowResult()
}
//Close our database connection...
sqlStatement.close()
println returnList
return [queryResultMap: returnList]
当我运行它时,我在控制台中看到以下内容,因此我知道returnList具有查询的结果列表:
Error 500: Internal Server Error
URI
/FinAid-WithdrawalProcessIndicatorUpdate/sfrwdrl/processWithdrawalIndicator
Class
groovy.lang.MissingPropertyException
Message
No such property: SPRIDEN_ID for class: edu.unm.processindicator.Sfrwdrl
Grails表现得像是在寻找一个域对象(edu.unm.processindicator.Sfrwdrl),而我试图从returnList中显示一个值(而那些不是域对象)。我知道returnList数组有值,因为这是我在return语句之前将输出打印到控制台时所看到的:
[SPRIDEN_ID:101638052, SFRWDRL_PIDM:1638080, SFRWDRL_PROCESSED_IND:Y, SFRWDRL_USER:P_SZPGF02_MAIN, SFRWDRL_USER_ID:null, SFRWDRL_ACTIVITY_DATE:2014-02-05 14:15:46.0, SFRWDRL_TERM_CODE:201410]
如果我可以路由到一些具体示例,这些示例显示如何返回查询结果并在非常感激的视图中显示它们。或者......我只是想解决这个问题,如果我想显示来自多个表的信息,我需要在我的域对象中定义一对多的关系吗?是我在Grails中尝试做的甚至可能吗?我已经完成了一系列搜索并在Grails文档中查看了标签信息,但我无法找到答案。提前致谢!
答案 0 :(得分:3)
首先,您在评论中提出的问题&#34; Grails实际上是否会返回简单的查询结果?&#34;。对此的答案是:绝对,是的。
使用Groovy Sql class,您可以非常轻松地完成此操作。但是,看起来你正在为自己制造更难的事情。
从以易于SQL注入的方式构建SQL开始。我强烈建议您考虑至少使用GString并进行变量替换。
接下来,您无需将查询结果放入示例中的returnList
。只需调用.executeQuery并将ResultSet返回给您的GSP即可。
最后,在GSP中显示结果。给定结果中的非标准bean名称列,最好在从ResultSet访问它们时使用引号引用它们。例如:
<td>${thisRecord.'SPRIDEN_ID'}</td>
通过这种方式,您不希望Groovy做什么。只需使用该名称访问该物业。
总之,在处理使用ORM不可能或不可取的第三方或遗留数据库时,可以使用Yes Grails。我个人在这方面取得了很大的成功。
答案 1 :(得分:0)
我发现我的代码确实有效。我得到的错误如下:
Error 500: Internal Server Error
URI
/FinAid-WithdrawalProcessIndicatorUpdate/sfrwdrl/processWithdrawalIndicator
Class
groovy.lang.MissingPropertyException
Message
No such property: SPRIDEN_ID for class: edu.unm.processindicator.Sfrwdrl
我最初发布的Controller代码是我实际做的缩短版本。我最初使用returnList数据来获取域对象:
private void updateSfrwdrlAndAddToList(pidm, unmId, term, ArrayList returnList)
{
def results
results = Sfrwdrl.where
{
sfrwdrlTermCode == term
sfrwdrlPidm == pidm
sfrwdrlProcessedInd == "Y"
}
for (i in results)
{
i.sfrwdrlProcessedInd = 'N'
i.sfrwdrlActivityDate = new Date()
i.sfrwdrlUserId = unmId
returnList.add(i)
}
}
然后我最终在上面的代码中重用了returnList。在上面的代码中我定义了变量,但在我的原始代码中,我认为执行以下操作会清除数组,以便我可以重用它:
returnList = []
sqlStatement.eachRow(sqlString){
returnResults << it.toRowResult()
}
println 'Here are the results!'
println returnResults
sqlStatement.close()
return [returnMap: returnResults]
当最初创建ArrayList时,我认为它的类型必须是我的域对象(edu.unm.processindicator.Sfrwdrl)。然后我错误地将查询结果放在该列表中(属于GroovyRowResult类型。
将returnList数组(类型为Sfrwdrl)发送到其中包含GroovyRowResult对象的视图是造成问题的原因。视图期望对象是Sfrwdrl类型(我的域对象)。
我现在在视图中看到了我的查询结果。