2012-01-06 13 views
1

Userクラスのフィールドには、typeのフィールドがあり、これもリストになります。Groovier Wayでどのように問い合わせますか?

のでtypeは、次のようになります。(これは事前に定義されている)

を、私は別のリストを持っている["a","b"]

["c","b"]ようsearchを言う今私が欲しいものなすべてUserインスタンスを検索することです私はユーザーtypesearchのいずれかの要素と一致することがわかります。

は、私は部分的な解決策を思い付いた:

def newQ = User.findAllByUsernameIsNotNull() 
newQ.each { eachIndex -> 
        query = eachIndex.type 
        result = query.findAll { it == "c" } 
        if(result.size() > 0) 
        { 
         ans << eachIndex.username 
        } 
        } 

上記のコードは動作しますが、ansリストは私の条件を満たすすべてのUserを持っています。しかし、あなたは明らかにquery.findAll行で、私はsearchから1つの要素の検索だけをしていることがわかります。私はすべてsearch要素の検索操作をqueryUsertypeフィールド)に対して実行したいと思います。

どうすれば実現できますか?私のソリューションとは別に、これを行う簡単な方法はありますか?

ありがとうございます。あなたは、いくつかのようにデータベースに行きたい検索する際、私は単一のクエリ

+0

"type"という名前のフィールドで動作しますか? "type"は予約されたキーワードのようです:http://grails.org/doc/latest/ref/Database%20Mapping/type.html – Philippe

+0

@Philippe:実際はそうですが、名前が変更されました。 –

答えて

2

あなたのような何かができますそれらは通常最も高価な操作であるため、可能な限り時間をかけてください。 User.withCriteria {..}がうまく動作すれば、私はそれを使用します(私は.withCriteria {}に精通していません)。 .withCriteria {}がmockDomainと連動するかどうかはまだ分かりません)ので、mockDomainがHSQLで動作しないので、これも動的ファインダを使用したい場合にも同様に機能します。

def search = ["c", "b"] 
def users = User.findAllByUsernameIsNotNull() 
users = users.findAll {it.type.intersect(search)} 
+0

私は見つかりませんでしたいずれかの方法。 'User.withCriteria {type {inList(search)}}'のようなことをすることができるのはクールですが、うまくいかないようです。ところで、 'u.username is not null'をクエリに追加して、元のコードと同じことを行うことができます:) – epidemian

+0

これはクエリにはエレガントな方法ですが、これを使用してエラーが発生します:' org.codehaus .groovy.grails.exceptions.InvalidPropertyException:クラス[クラスmnm.schedule.User] 'の名前[all]のプロパティが見つかりませんでした。何か間違っている? –

+0

リストでパラメータを試してみてください(元のコードを更新しました) – leebutts

0
User.withCriteria { 
    isNotNull("username") 
    'in' ("type", search) 
} 
+1

'type'属性はコレクションであり、単一の値。 – epidemian

+0

永続的なコレクションですか? – jenk

+1

@Antのコードから、私はそれが 'def List type'か、Userクラスのstatic hasMany = [type:String]'であると仮定します( 'type'がコレクションとして使われることに注意してください)。 – epidemian

0

でそれを行うための方法を考えることはできません

def ans = [] 
search.each{s-> 
    ans += User.findAll("from User u where u.username is not null and ? in elements(u.type)",[s]) 
}