2

次のようなコードがあるとします。

def c = Account.createCriteria()
def results = c {
    between("balance", 500, 1000)
    eq("branch", "London")
    or {
        like("holderFirstName", "Fred%")
        like("holderFirstName", "Barney%")
    }
    maxResults(10)
    order("holderLastName", "desc")
}

lower() 関数を使用してデータを小文字に変換したい

def c = Account.createCriteria()
def results = c {
    between("balance", 500, 1000)
    eq("branch", "London")
    or {


        like("lower(holderFirstName)", "Fred%")
        like("lower(holderFirstName)", "Barney%")


    }
    maxResults(10)
    order("holderLastName", "desc")
}

コードが機能しません。正しい構文は何ですか? ウムラウトに問題があるので使用したくないilike

4

3 に答える 3

3

どのlower関数を使用したいのかわかりませんがholderFirstName、大文字と小文字を区別せずにプロパティに基づいてデータをフェッチしたいと思います。

ilikeここでは、大文字と小文字を区別しない を使用できますlike

def c = Account.createCriteria()
def results = c.list {
    between("balance", 500, 1000)
    eq("branch", "London")
    or {
        ilike("holderFirstName", "Fred%")
        ilike("holderFirstName", "Barney%")
    }
    maxResults(10)
    order("holderLastName", "desc")
}

ところで - あなたはlist()あなたの基準に電話するのを逃しました...

アップデート

formula次のように、ドメイン クラスにを追加してみてください。

static mapping = {
   lowerFirstName formula: "lower(holder_first_name)"

}

条件のプロパティを次のように変更しますlowerFirstName

like("lowerFirstName", "fred%") // changed 'Fred%' to 'fred%' 

コードはテストされていませんが、動作するはずです。

于 2013-05-14T13:05:15.677 に答える
2

条件でデータベース関数を使用するには、sqlRestriction()その追加の制限を生成された SQL に直接使用する必要があります。

def c = Account.createCriteria()
def results = c.list {
...
  sqlRestriction("lower(holder_first_name) like '%%'")
}

これでは、属性名ではなく、列名を使用することに注意してください。

于 2013-05-14T14:05:19.667 に答える
1

大文字と小文字を区別しないように比較しようとしている場合、別のオプションはその目的で ilike を使用することです。Ilike は Like に似ていますが、大文字と小文字が区別されません。ここ

(質問に追加されたように)ilikeを使用したくない場合は、代わりのアプローチがexecuteQueryとhqlだと思います。

Account.executeQuery(" select * from Account where .... or (lower(holderFirstName) = 'Fred%' ...")
于 2013-05-14T13:03:51.143 に答える