如何創建一個分離的謂詞以發送到一個方法,然后使用條件進行搜索?
像這樣的東西:
def predicate = { eq 'field1', 1 }
search(predicate)
--
def search(predicate) {
return SampleClass.withCriteria() {
predicate
eq 'field2', 2
eq 'field2', 3
}.find()
}
有一種方法可以避免條件內的 ifs 嗎?
uj5u.com熱心網友回復:
您可以采取不同的方法。一個在github.com/jeffbrown/victorsoarescriteria的專案中有代表。
grails-app/domain/victorsoarescriteria/SampleClass.groovy
package victorsoarescriteria
class SampleClass {
String name
String country
int someNumber
}
grails-app/init/victorsoarescriteria/BootStrap.groovy
package victorsoarescriteria
import grails.gorm.transactions.Transactional
class BootStrap {
def init = { servletContext ->
initData()
}
def destroy = {
}
@Transactional
void initData() {
new SampleClass(name: 'Jeff', country: 'United States', someNumber: 42).save()
new SampleClass(name: 'Jake', country: 'United States', someNumber: 21).save()
new SampleClass(name: 'Bill', country: 'United Kingdom', someNumber: 27).save()
def greaterThanFive = search {
gt 'someNumber', 5
}
println "greaterThanFive.size() is ${greaterThanFive.size()}"
def greaterThanTwentyFive = search {
gt 'someNumber', 25
}
println "greaterThanTwentyFive.size() is ${greaterThanTwentyFive.size()}"
}
def search(predicate) {
SampleClass.withCriteria {
predicate.delegate = delegate
predicate()
}
}
}
輸出:
~ $ git clone git@github.com:jeffbrown/victorsoarescriteria.git && cd victorsoarescriteria && ./gradlew bootRun
Cloning into 'victorsoarescriteria'...
remote: Enumerating objects: 113, done.
remote: Counting objects: 100% (113/113), done.
remote: Compressing objects: 100% (85/85), done.
remote: Total 113 (delta 15), reused 113 (delta 15), pack-reused 0
Receiving objects: 100% (113/113), 803.93 KiB | 3.77 MiB/s, done.
Resolving deltas: 100% (15/15), done.
> Task :bootRun
greaterThanFive.size() is 3
greaterThanTwentyFive.size() is 2
Grails application running at http://localhost:8080 in environment: development
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/494636.html
標籤:休眠 圣杯 grails-orm 休眠标准
