Вопрос новичка в grails «createCriteria»

#grails #criteria

#grails #критерии

Вопрос:

Я новичок в Grails criteria builder, может кто-нибудь, пожалуйста, объяснить, что означает следующее?

 def c = Account.createCriteria()
         def results = c {

             like("holderFirstName", "Fred%")
             and {
                 between("balance", 500, 1000)
                 eq("branch", "London")
             }
             maxResults(10)
             order("holderLastName", "desc")
         }
  

Означает ли это

  • Select * from account where
    holderFirstName like 'fred%' and
    (balance between 500 and 1000 **and**
    branch='london
    ‘)
  • Select * from account where
    holderFirstName like 'fred%' and
    (balance between 500 and 1000 **or**
    branch='london
    ‘)

Если я хочу использовать «или» и «и» вместе, как мне это сделать?

Ответ №1:

Ваш пример будет выполняться как:

 select * from account 
where holderFirstName like 'Fred%' 
and balance between 500 and 1000 
and branch = 'London'
  

Подразумевается, что все условия верхнего уровня должны выполняться совместно. Вы могли бы создать те же критерии, что и:

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

Чтобы получить свой второй запрос, используйте этот критерий:

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

Вложите свои and / or замыкания в более сложные критерии.

Ответ №2:

Ваши текущие критерии означают «и» в двух условиях баланса и ветвления. итак

Выберите * из учетной записи, в которой указано имя владельца, например ‘fred%’ и (баланс от 500 до 1000 и филиал = ‘лондон’), правильно, просто оно будет содержать максимум 10 результатов и будет отсортировано на основе «Последнего имени владельца» в порядке убывания.

Для совместного использования and и or вам также необходимо указать блок or в критериях, чтобы ваши критерии выглядели примерно так

 Account.createCriteria()
         def results = c {

             like("holderFirstName", "Fred%")
             and {
                 between("balance", 500, 1000)
                 eq("branch", "London")
             }
             or{
                 eq("prop1", prop1)
                 eq("prop2",prop2)
             }
             maxResults(10)
             order("holderLastName", "desc")
         }
  

в этих критериях есть и между условиями баланса и ветвления. а также или между prop1 и prop2