2014-07-15 19 views
0

我想執行一個sql語句並將結果返回到Grails中的視圖。爲了澄清,我沒有試圖返回域對象並將它們顯示在視圖上。我有一個簡單的查詢,我加入了兩個表格,我只想將結果傳遞給視圖進行顯示。將查詢結果返回到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

如果這是兩個表的簡單查詢,爲什麼使用SQL直接? –

+0

我組織即將開始使用Grails,現在我們正處於探索階段,我們將使用我們未設計的供應商提供的數據庫。我們希望通過許多連接執行復雜的查詢。這個問題不僅僅是我問如何解決這個問題。我們需要知道Grails實際上是否可以返回簡單的查詢結果(而不是域對象),因爲它會影響我們的開發人員代碼的標準... –

回答

3

首先,您在您的評論中提出的關於「Can Grails實際上是否可以返回簡單查詢結果?」的問題。答案是:當然,是的。

使用Groovy的Sql class你可以很容易地做到這一點。但是,看起來你正在爲自己製造困難。

從您以一種容易出現SQL注入的方式構建SQL開始。我強烈建議你考慮使用至少一個GString並進行變量替換。

接下來,在您的示例中沒有必要將查詢結果放入returnList。只需調用.executeQuery並將ResultSet返回給您的GSP即可。

最後,在您的GSP中顯示結果。鑑於您的結果中包含非標準bean名稱列,最好在從ResultSet訪問它們時使用引號引用它們。例如:

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

這種方式對於您希望Groovy做什麼沒有任何困惑。只需通過該名稱訪問該房產。

總之,在處理使用ORM的第三方或舊數據庫是不可能或不可取的情況下,可以使用是Grails。我個人在這方面取得了巨大的成功。

+0

謝謝Joshua - 當涉及到這個問題和您的建議時,我們就是nubes SQL注入 - 已經讓我們看到了一些東西。感謝您花時間回覆!我弄清楚根本問題是什麼,並在下面發佈。如果我真的發佈了控制器的所有代碼,我相信你會對我的錯誤置之不理。再次感謝。 –

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 

我最初發布的控制器代碼是我實際上做的事情的縮短版本。我原來用的是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 Array(其類型爲Sfrwdrl)發送到其中包含GroovyRowResult對象的視圖是導致該問題的原因。鑑於預期的對象爲類型Sfrwdrl(我的域對象)。

現在我看到在我的視圖查詢結果。