2011-04-03 50 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