第一个问题:
我的应用中有以下域类:
class Test {
...
String name
static hasMany = [evaluationsTest: Evaluation]
...
}
class Evaluation {
...
String testName
Float testScore
...
}
我需要获得特定测试的一系列分数(例如:分数在7-8之间的评估)之间的评估数量。
使用标准我可以正确获取:
def criteria = Test.createCriteria()
def example = criteria.list {
eq 'name', params.test
evaluationsTest {
ge("testScore", 7 as Float)
lt("testScore", 8 as Float)
}
projections {
count()
}
}
但我想知道异步搜索,因此我想使用DetachedCriteria但它不起作用。
DetachedCriteria detached = Test.where {
name == params.test
evaluationsTest {
ge("testScore", 7 as Float)
lt("testScore", 8 as Float)
}
.projections {
count()
}
} as DetachedCriteria
def result = detached.async.list()
已编辑:使用withCriteria()方法解决。
第二个问题:
此外,我有另一个疑问。我需要并行化这段代码。我该怎么做每个片段?我曾经任务,但有时会工作,其他时间会出现错误:数组索引超出界限
// Rows
def rows = []
def addRow = { name, value ->
rows << [c: [[v: name], [v: value]]]
}
// Add departments
departments.each { department ->
addRow(department.name, department.users.size())
}
def UDData = [cols: cols, rows: rows]
使用此代码(任务),我获得:数组索引超出范围
List queriesToExecute = []
// Add departments - Asynchronous/Multi-thread
departments.each { department ->
def departmentTask = tasks {
rows << [c: [[v: department.name], [v:department.users.size()]]]
}
queriesToExecute << departmentTask
}
waitAll(queriesToExecute)
答案 0 :(得分:1)
您的查询可能失败的一个原因是您正在创建 where 查询而不是条件查询,而其中查询不能很好地支持预测。他们工作......但有时只是。而且您必须在查询之外定义它们,如下所示:
DetachedCriteria detached = Test.where {
name == params.test
evaluationsTest {
ge("testScore", 7 as Float)
lt("testScore", 8 as Float)
}
}.projections {
count()
} as DetachedCriteria
但是,您实际上并不需要DetachedCriteria
来执行异步查询。您可以使用条件查询来执行此操作:
def promise = Test.async.withCriteria() {
eq 'name', params.test
evaluationsTest {
ge("testScore", 7 as Float)
lt("testScore", 8 as Float)
}
projections {
count()
}
}
def result = promise.get()
以下是使用GPars同时收集部门数据的示例,没有副作用:
import static groovyx.gpars.GParsPool.withPool
def rows
withPool {
rows = departments.collectParallel { department ->
[c: [[v: department.name], [v:department.users.size()]]]
}
}
def UDData = [cols: cols, rows: rows]
这是使用fork-join。所以Closure
同时执行,然后结果连接在一起。