在Grails中,将查询结果返回给视图



我想在Grails中执行一条sql语句并将结果返回给视图。澄清一下,我不是试图返回域对象并在视图上显示它们。我有一个简单的查询,我加入两个表,我只是想把结果传递给视图显示。

下面是我视图中的代码:
<%@ 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. processindicators . strwdrl),我试图从returnList(和那些不是域对象)显示一个值。我知道returnList数组有值,因为这是我看到的,当它在返回语句之前将输出输出到控制台时:

[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文档中的标签信息,但我很难找到答案。提前感谢!

首先,您在评论中提出的关于"Grails实际上能返回简单查询结果吗?"的问题。这个问题的答案是:绝对可以。

使用Groovy的Sql类可以很容易地做到这一点。然而,你似乎是在给自己制造麻烦。

从你以一种容易发生SQL注入的方式构建SQL开始。我强烈建议您考虑至少使用一个GString并进行变量替换。

接下来,在示例中不需要将查询结果放入returnList。只需调用. executequery并将ResultSet返回给GSP就可以了。

最后,在GSP中显示结果。给定结果中的非标准bean名称列,最好在从ResultSet访问它们时使用引号引用它们。例如:

<td>${thisRecord.'SPRIDEN_ID'}</td>

这样就不会对你想要Groovy做什么产生任何困惑。只需通过该名称访问该属性。

总而言之,是的,Grails可以用于处理第三方或遗留数据库,而使用ORM是不可能或不可取的。

我发现我的代码确实可以工作。我得到的错误如下:

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

我最初发布的控制器代码是我实际做的事情的简化版本。我最初使用的是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]

当数组列表最初创建时,我认为它的类型必须是我的域对象(edu.unm. processindicators . strwdrl)。然后,我错误地将查询结果放在该列表中(属于GroovyRowResult类型)。

将returnList数组(类型为strwdrl)发送到视图中,其中包含GroovyRowResult对象,这是导致问题的原因。视图期望对象类型为strwdrl(我的域对象)。

我现在在视图中看到我的查询结果。

相关内容

  • 没有找到相关文章

最新更新