4

Grails アプリケーション (2.2.4) があります。私が持っているドメインクラスの場所は次のようになります

class Author implements Serializable {
    ....
  static hasMany = [
    book : Book 
  ]
  static namedQueries = {
      hasGenre {genreNameList -> 
            book{
               genres {  
                   'title' in genreNameList 
           } 
       }
   }
  }
}

class Book implements Serializable{

    Author author
    Genres genres
    static belongsTo = [author: Author , genre: Genres ]
       static mapping = {
       .....
        author lazy: false
       }
}

class Genres implements Serializable{

    String title

 }

以下のようにクエリを実行すると、すべての値が取得され、genereNameList にジャンルを持つ本が少なくとも 1 冊ある著者だけではありません。

String comaSeperatedGenereName = "genere1,genere2"
def genereNameList = comaSeperatedGenereName.split(",")
Author.hasGenre(genereNameList)

しかし、次のようにnamedQueryを変更すると、

      hasGenre {genreName -> 
            book{
               genres {  
                   eq 'title' , genreName 
           } 
       }

そして、次のような文字列を渡すと

Author.hasGenre('genere1')

これは期待どおりに機能します。足りないものはありますか?

前もって感謝します

4

2 に答える 2

1

基準クエリと SQL などのネイティブ クエリの微妙な違いは、基準クエリは実際のクエリではないということです。クエリビルダーです。

つまり、条件クエリは、SQL データベースで実行される SQL クエリと同じ意味では実行されません。代わりに、条件クエリを実行してデータベース クエリを生成します。これを念頭に置いておくと、何がうまくいかなかったのかを簡単に確認できます。

hasGenre {genreNameList -> 
    book{
       genres {  
           'title' in genreNameList 
       }
   } 
}

'title' in genreNameListはブール値を返します。クライテリア クエリのビルダー メソッドが呼び出されないため、クライテリア クエリには影響しません。したがって、最終的にクエリはすべてを返すように構築されます。

条件クエリの Groovy の in キーワードに相当するのはin()メソッドです。

hasGenre {genreNameList -> 
    book{
       genres {  
           'in'('title', genreNameList)
       }
   } 
}

これにより、期待するクエリが構築されます。ただし、inGroovy ではキーワードであるため、メソッドを実行するにはその名前を引用符で囲む必要があります。同じことを達成するためのより審美的に楽しい方法は方法だと思いますinList()

hasGenre {genreNameList -> 
    book{
       genres {  
           inList('title', genreNameList)
       }
   } 
}

最後に、ビルダーの概念をよりよく説明するために、同じことを行うためのより詳細な方法を次に示します。

hasGenre {genreNameList -> 
    book{
       genres {  
           or {
               genreNameList.each {
                   eq('title', it)
               }
           }
       }
   } 
}

このクエリはeq()、ジャンル タイトルごとに呼び出すことによって作成されます。最終結果は、複数のまたは接続詞を含むクエリです (例: title = 'foo' または title = 'bar'...)。

于 2015-10-16T14:07:48.143 に答える
1

groovy in 演算子があり、あなたの基準の代わりに groovy in 演算子を取得していると思われます。

コードを次のように変更してみてください

  static namedQueries = {
      hasGenre {genreNameList -> 
            book{
               genres {  
              'in'  'title', genreNameList 
           } 
       }
   }
  }
于 2015-10-16T10:34:49.593 に答える