0

プラットフォーム | Grails バージョン: 3.0.7 | Groovy バージョン: 2.4.4 | JVM バージョン: 1.8.0_51

Grails HQL クエリで名前付きパラメーターを使用できないようです。以下は機能します (Grails サービス クラス内)。

    def query = 'from Event event ' +
                'where event.eventName like ? ' +
                'or event.address.town like ?'
    def results = Event.executeQuery(query, ["%London%", "%London%"], [offset: 5, max: 5])

ただし、以下は機能しません。

    def query = 'from Event event ' +
                'where event.eventName like :searchEventName ' +
                'or event.address.town like :searchTownName'
    def results = Event.executeQuery(query, [searchEventName, "%London%", searchTownName, "%London%"], [offset: 5, max: 5])

表示されるエラーは次のとおりです。

Class
groovy.lang.MissingPropertyException
Message
null
Caused by
No such property: searchEventName for class: com.mchq.event.SearchService

私が正しいと思うことに反して、プロパティを宣言します...

    def searchEventName, searchTownName
    def query = 'from Event event ' +
                'where event.eventName like :searchEventName ' +
                'or event.address.town like :searchTownName'
    def results = Event.executeQuery(query, [searchEventName, "%London%", searchTownName, "%London%"], [offset: 5, max: 5])

報告されたエラーは次のとおりです。

Class
java.lang.IllegalArgumentException
Message
null
Caused by
No positional parameters in query: from Event event where event.eventName like :searchEventName or event.address.town like :searchTownName

最後のテストとして、変数宣言と名前付きパラメーター リストを削除して、次のことを試します。

    def query = 'from Event event ' +
                'where event.eventName like :searchEventName ' +
                'or event.address.town like :searchTownName'
    def results = Event.executeQuery(query, [offset: 5, max: 5])

そして当然のことながら、メッセージは次のように返されます。

Class
org.hibernate.QueryException
Message
null
Caused by
Not all named parameters have been set: [searchEventName, searchTownName] [from Event event where event.eventName like :searchEventName or event.address.town like :searchTownName]

誰かが私が犯している間違いを教えてもらえますか? 位置パラメーターは検索だけで機能しているようですが、名前付きパラメーターのマップを渡すと、この奇妙なエラーが発生します

4

2 に答える 2

2

名前付きクエリの場合、リストではなくマップを渡すため、大きなタイプミスをしています。以下のコードを参照してください。

def query = 'from Event event ' +
                'where event.eventName like :searchEventName ' +
                'or event.address.town like :searchTownName'
    def results = Event.executeQuery(query, [searchEventName: "%London%", searchTownName: "%London%"], [offset: 5, max: 5])

それが役に立てば幸い!

于 2016-01-15T10:03:00.203 に答える
1

パラメータを渡す方法が間違っています。[searchEventName, "%London%", searchTownName, "%London%"]groovy のリストです。

これらを Map として指定する必要があります。マップは次のように定義されます[key1:value1, key2:value2].

したがって、パラメーターを渡す正しい方法は次のようになります[searchEventName: "%London%", searchTownName: "%London%"]

于 2016-01-15T10:45:00.880 に答える