2011-04-03 62 views
2

我想構建一個web界面來呈現logdata。這應該是嘗試使用Grails構建一個小型Web應用程序的好機會,我一直想嘗試一段時間,但是我在理解如何將當前的手動sql查詢翻譯成某些可用於Grails的東西。將數據挖掘sql-queries轉換爲Grails等價物?

我還沒有發現有關將現有數據表加載到書中Grails In Action中的域類上的太多信息。所以,我將在這裏進行一些澄清:)

這基本上是對數表,我登錄到今天的模式:

LOG(id,method,timestamp,millis_used,username,hostname,...etc) 

我可以看到自己做的事情,如創建域類用戶和主機像hasMany = { logs: Log }這樣的映射和一個帶有belongsTo = { user: User }的Log類,但並不知道如何以有效的方式使用它來查詢我的數據,特別是在處理成千上萬的日誌行時。我通常對數據進行查詢,如"find the average time used for method='fooBar' and user='john_doe' the last 30 days""count the number of rows where method='fooBaz' and host='localhost' from May to December"

你將如何去檢索這樣的信息?你會忘記映射日誌條目,只是在表上使用某種直接的SQL(HQL?)查詢,或者可以使用這種(對我來說不知道)GORM beast來做這樣的事情嗎?

回答

4

首先,我同意特德的響應。在設置GORM域之前,請查看Burt's presentation

二,我建議你看看Criterias。 Hibernate Criteria功能的grails DSL提供了一個非常乾淨且可維護的代碼庫。下面是一些例子:

實施例標準:

def avg = Log.createCriteria().get { 
    projections { 
     avg 'duration' 
    } 
    user { 
     eq 'userName', 'user1' 
    } 
} 
println("Average = ${avg}") 

實施例域對象:

class User { 

    String userName 
    String firstName 
    String lastName 

    static constraints = { 
     userName nullable:false, maxSize:32 
     firstName nullable:false, maxSize:50 
     lastName nullable:false, maxSize:50 
    } 

} 

class Host { 

    String hostname 

    static mapping = { 
     version false 
    } 

    static constraints = { 
     hostname nullable:false, maxSize:64 
    } 
} 

class Log { 

    Host host 
    User user 
    String method 
    String logMessage 
    Date dateCreated 
    long duration 

    static mapping = { 
     autoTimestamp true //Note: this will automatically update dateCreated and lastUpdate 
     version false 
    } 

    static constraints = { 
     host nullable:false 
     user nullable:false 
     method nullable:false, maxSize:50 
     logMessage nullable:false, maxSize:255 
     duration nullable:false 
    } 
} 
+0

約審覈規定好一點。我沒有發現他們個人適合我的大腦,但有些人喜歡他們比HQL好一點。我來自SQL背景,所以我發現相當的HQL對我來說更容易編寫/讀取/維護。這裏是OP的參考:'Log.executeQuery(「從日誌l選擇平均值(持續時間)連接l.user你在哪裏u.firstName =:firstName」,[firstName:'user1'])' – 2011-04-04 04:49:07

+0

突然遇到Criterias在我今晚1點的Grails in Action書中,我認爲他們完全符合這個法案。很高興看到一個很好的用法例子:) – oligofren 2011-04-04 07:41:29

2

對於每個用戶或每臺主機都可能記錄的記錄數量,我不會使用hasMany關係。日誌記錄往往寫得很重,維護每個成員的日誌集/列表的成本是不值得的。

HQL可能是您最好的選擇。你可以將它製作成很像本機SQL。

伯特貝克威思有關於一些性能Grails中與會談格姆那會是值得你花時間看一個偉大的演講:http://www.infoq.com/presentations/GORM-Performance