В чем разница между criteria и CreateCriteria в Grails?

В чем их разница и почему и где мы должны их использовать, я думаю, кажется, что у них нет никакой разницы?

Ответ 1

Стоит добавить, что я только что встретил в документации grails для createCriteria().

Поскольку этот запрос включает параметры разбивки на страницы (макс и смещение), это возвращает PagedResultList, у которого есть метод getTotalCount(), чтобы вернуть общее количество совпадающих записей для разбивки на страницы. Два запроса все еще запущены, но они запускаются для вас, а результаты и общее количество объединяются в PagedResultList.

Источник

Это означает, что вы можете использовать getTotalCount() без необходимости инициировать вызов (он сделан для вас). Это очень полезно. Пример документации показывает:

def c = Account.createCriteria()
def results = c.list (max: 10, offset: 10) {
    like("holderFirstName", "Fred%")
    and {
        between("balance", 500, 1000)
        eq("branch", "London")
    }
    order("holderLastName", "desc")
}
println "Rendering ${results.size()} Accounts of ${results.totalCount}"

Эта возможность недоступна при использовании withCriteria().

Ответ 2

withCriteria {... } является, по существу, сокращением для createCriteria().list {... }. Если вам нужно использовать какие - либо другие методы критериев (получить, граф,...) или передать параметры нумерации страниц в list, то вы должны использовать форму длинных рук.

SomeDomain.createCriteria().list(max:10, offset:50) {
  // ...
}

Ответ 3

Пример createCriteria():

def criteria = OfferCredit.createCriteria {
    offer {
        eq('status', LeverageUtils.ACTIVE_STATUS)
        ge('expirationDate', new Date())
    }
    user {
        eq('userId', userId)
    }
    eq('status', LeverageUtils.ACTIVE_STATUS)
    order('creationDate', 'asc')
}

criteria.list()

Пример withCriteria():

List<Supermarket> results = Supermarket.withCriteria {
    like("sp_street", params.street)
    productSupermarket {
         product {
            idEq(params.product)
        }
        // or just eq('product', someProduct)
    }
    maxResults(10)
}

Ответ 4

withCriteria выполняет и возвращает список. Он обеспечивает закрытие, с помощью которого вы можете настроить критерии до того, как они будут выполнены.

createCriteria просто создает объект критериев, который вы можете изменить, а затем явно вызовите метод list для выполнения.

Если критерии просты или если они определены в одном месте, лучше использовать withCriteria.

Если вам нужно пройти критерии (создать его в одной функции и передать его другим), createCriteria будет лучше. Я думаю, что поддержка Criteria ограничена.

Ответ 5

withCriteria ->

Назначение → Разрешает встроенное выполнение запросов Criteria. Если совпадающие записи не найдены, возвращается пустой список.

Если указана проекция:

returns a single value if it only contains one field
a List in case there are multiple fields in the projection