我正在開發一個GRAILS應用程序(我是GRAILS的新手,並繼承了以前的開發人員的項目)。我正在慢慢掌握GRAILS如何操作以及DOMAIN類,休眠等的使用。MySQL數據庫託管在Amazon上,我們正在使用ElasticCache。grails:將SQL轉換爲域類
做你們任何一位更有見識的人都知道如何將下面的SQL語句轉換爲域類和查詢條件。
if(params?.searchterm) {
def searchTerms = params.searchterm.trim().split(',')
def resultLimit = params.resultlimit?: 1000
def addDomain = ''
if (params?.domainname){
addDomain = " and url like '%${params.domainname}%' "
}
def theSearchTermsSQL = ""
/*
* create c.name rlike condition for each search term
*
*/
searchTerms.each{
aSearchTerm ->
if(theSearchTermsSQL != ''){
theSearchTermsSQL += ' or '
}
theSearchTermsSQL += "cname rlike '[[:<:]]" + aSearchTerm.trim() + "[[:>:]]'"
}
/*
* build query
*
*/
def getUrlsQuery = "select
u.url as url,
c.name as cname,
t.weight as tweight
from
(category c, target t, url_meta_data u)
where
(" + theSearchTermsSQL + ")
and
t.category_id = c.id
and t.url_meta_data_id = u.id
and u.ugc_flag != 1 " + addDomain + "
order by tweight desc
limit " + resultLimit.toLong()
/*
* run query
*
*/
Sql sqlInstance = new Sql(dataSource)
def resultsList = sqlInstance.rows(getUrlsQuery)
}
的表是如下(僞數據):
[Category]
id | name
-----------
1 | small car
2 | bike
3 | truck
4 | train
5 | plane
6 | large car
7 | caravan
[Target]
id | cid | weight | url_meta_data_id
----------------------------------------
1 | 1 | 56 | 1
2 | 1 | 76 | 2
3 | 3 | 34 | 3
4 | 2 | 98 | 4
5 | 1 | 11 | 5
6 | 3 | 31 | 7
7 | 5 | 12 | 8
8 | 4 | 82 | 6
[url_meta_data]
id | url | ugc_flag
---------------------------------------------
1 | http://www.example.com/foo/1 | 0
2 | http://www.example.com/foo/2 | 0
3 | http://www.example.com/foo/3 | 1
4 | http://www.example.com/foo/4 | 0
5 | http://www.example.com/foo/5 | 1
6 | http://www.example.com/foo/6 | 1
7 | http://www.example.com/foo/7 | 1
8 | http://www.example.com/foo/8 | 0
域類
class Category {
static hasMany = [targets: Target]
static mapping = {
cache true
cache usage: 'read-only'
targetConditions cache : true
}
String name
String source
}
class Target {
static belongsTo = [urlMetaData: UrlMetaData, category: Category]
static mapping = {
cache true
cache usage: 'read-only'
}
int weight
}
class UrlMetaData {
String url
String ugcFlag
static hasMany = [targets: Target ]
static mapping = {
cache true
cache usage: 'read-only'
}
static transients = ['domainName']
String getDomainName() {
return HostnameHelper.getBaseDomain(url)
}
}
基本上,從url_meta_data一個url可以關聯到許多類別。因此,本質上,我試圖實現應該是一個相對基本的操作...返回搜索詞'汽車'的所有網址,它們的權重(即重要性)和ugc_flag不是1(即該網址不是用戶生成的內容)。數據庫中有100K以上的記錄,這些記錄是從第三方提供商導入的。請注意,所有的URL都屬於我的客戶 - 這裏沒有做任何狡猾的事情。
請注意我在查詢中使用的rlike - 我最初使用的是ilike%searchterm%,但會發現其中searchterm是較大單詞的一部分的類別,例如'caravan') - 不幸的是,雖然rlike不是如果用戶請求「汽車」將返回任何東西。
我編輯了代碼 - 正如伊戈爾指出最初的'domainName'的奇怪包含。這是一個可選的參數傳遞,允許用戶過濾只有某個域名的網址(例如'example.com')
由於矢量當
or
限制效果更好。我很高興通過循環遍歷resultsList,並且現在我正在將它發送到gsp視圖,就像您提到的一樣。我實際上從代碼中刪除了這個問題,只是爲了將我的問題集中在如何將SQL轉換爲休眠狀態。 – Ewen