1

find allを使用してドメインオブジェクトのクエリを実行しようとすると、期待どおりに機能しません。

searchResults = Contact.findAll("from Contact as c where c.company=${params.company.id} and c.firstName = '%${nameSearch}%'  or c.lastName = '%${nameSearch}%' ")

入力した検索に類似した名または姓を持つ会社内のすべての人を検索したい(params.searchはnameSearch変数に格納されていました)。最初または最後の値を特定の名前「Tim」または「Johnson」に変更すると、機能します。

変数または「like」参照で何を間違って行っていますか?%記号は基本的に検索条件の*記号だと思いましたか?

2.0.0形式の検索を試しました。

        searchResults = Contact.findAll{
            company == params.company.id
            firstName == '%' + nameSearch + '%'
            lastName == '%' + nameSearch + '%'
        }

しかし、それもうまくいきませんでした。すべての助けをありがとう

4

1 に答える 1

7

これを試してみてください:

def company = Company.get(params.company.id)
def searchResults = Contact.withCriteria {
    eq('company', company)
    or {
        ilike('firstName', '%' + nameSearch + '%')
        ilike('lastName', '%' + nameSearch + '%')
    }
}

インスタンスを取得したくない場合は、代わりにブロック内でCompany使用できます。idEq()company { }


HQLの試みで間違っていたいくつかの(おそらくそれ以上の)こと:

  • あなたのcompany条件は、オブジェクト(c.company)をid値(params.company.id)と比較することでした
  • ブール論理を正しくグループ化する必要がありまし(company AND (first OR last))た。(company AND first OR last)
  • likeの代わりに使用する必要があります=、例えばfirstName like '%something%'

セキュリティの問題として、実際には、値をインラインで使用してHQLステートメントを作成するべきではありません。代わりに名前付きパラメーターを使用する必要があります。findAllドキュメントの中間の例のいくつかをチェックしてください。

于 2012-02-26T20:46:52.660 に答える