条件 - Grails 中的 DetachedCriteria
Criteria - DetachedCriteria in Grails
第一个问题:
我的应用程序中有以下域 class:
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() 方法解决。
第二个问题:
另外,我还有一个疑惑。我需要并行化这段代码。我该怎么做每个片段?我曾经 task 但有时工作,其他时候出现错误: Array Index Out of Bounds Exception
// 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)
您的查询可能失败的一个原因是您正在创建 where 查询而不是 criteria 查询,并且 where 查询不能很好地支持预测。他们工作......但只是有时。而且您必须在查询之外定义它们,如下所示:
DetachedCriteria detached = Test.where {
name == params.test
evaluationsTest {
ge("testScore", 7 as Float)
lt("testScore", 8 as Float)
}
}.projections {
count()
} as DetachedCriteria
但是,您实际上不需要 DetachedCriteria
来执行异步查询。您可以使用 criteria 查询来完成:
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
并发执行,然后将结果拼接在一起
第一个问题:
我的应用程序中有以下域 class:
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() 方法解决。
第二个问题:
另外,我还有一个疑惑。我需要并行化这段代码。我该怎么做每个片段?我曾经 task 但有时工作,其他时候出现错误: Array Index Out of Bounds Exception
// 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)
您的查询可能失败的一个原因是您正在创建 where 查询而不是 criteria 查询,并且 where 查询不能很好地支持预测。他们工作......但只是有时。而且您必须在查询之外定义它们,如下所示:
DetachedCriteria detached = Test.where {
name == params.test
evaluationsTest {
ge("testScore", 7 as Float)
lt("testScore", 8 as Float)
}
}.projections {
count()
} as DetachedCriteria
但是,您实际上不需要 DetachedCriteria
来执行异步查询。您可以使用 criteria 查询来完成:
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
并发执行,然后将结果拼接在一起