我想构建一个Web界面来呈现logdata。这应该是一个很好的机会尝试使用Grails构建一个小的Web应用程序,我一直想尝试一段时间,但我在理解如何“翻译”今天的手动sql查询时遇到一些麻烦可用于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野兽可以用于这样的东西吗?
答案 0 :(得分: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
}
}
答案 1 :(得分:2)
对于每个用户或每个主机记录的记录数量很多,我不会使用hasMany关系。日志记录往往写得很重,维护每个成员的日志集/列表是不值得的。
HQL可能是你最好的选择。你可以把它看成很像原生SQL。
Burt Beckwith有一个很棒的演讲,讲述了GORM的一些表演,值得您花些时间观看:http://www.infoq.com/presentations/GORM-Performance