В чем их разница и почему и где мы должны их использовать, я думаю, кажется, что у них нет никакой разницы?
В чем разница между 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