Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Grails 圣杯<;其中>;返回包含所有条目的DetachedCriteria_Grails_Gorm_Criteria - Fatal编程技术网

Grails 圣杯<;其中>;返回包含所有条目的DetachedCriteria

Grails 圣杯<;其中>;返回包含所有条目的DetachedCriteria,grails,gorm,criteria,Grails,Gorm,Criteria,这将返回域类的所有元素。更一般的情况是: Domain.where { 1 == 0 }.count() 将返回所有元素;如果我使用其中一个字段并设置一个假条件,则结果与预期一致 我的问题是为什么会发生这种情况(第一个案例)?如果这是一个太天真的问题,请建议一些阅读材料。谢谢 我使用的grails版本是2.3.6(在较新的版本中可能会有所不同?我不确定您想要实现什么,但这里有一个解释(可能有点笼统:) 传递给的方法实际上是一个用于指定SQL标准的DSL,它只是使用普通的Groovy语法

这将返回域类的所有元素。更一般的情况是:

Domain.where {
    1 == 0
}.count()
将返回所有元素;如果我使用其中一个字段并设置一个假条件,则结果与预期一致

我的问题是为什么会发生这种情况(第一个案例)?如果这是一个太天真的问题,请建议一些阅读材料。谢谢


我使用的grails版本是2.3.6(在较新的版本中可能会有所不同?

我不确定您想要实现什么,但这里有一个解释(可能有点笼统:)

传递给
的方法实际上是一个用于指定SQL标准的DSL,它只是使用普通的Groovy语法来假装更自然。但是当你做
someProperty!=5&&someOtherProperty==6
未直接计算,但经过转换,最终在SQL查询中显示为
select*from Domain where some_property!=5和一些其他属性=6

由于未在条件中传递对属性的任何引用(
1==0
),因此分离的条件DSL计算器将忽略该属性,从而返回
select*from domain
的结果。您可以尝试这样做,例如
id!=id
查看如何得到一个空列表作为结果。如果再次检查结果查询,您将看到包含idid的

您可以了解有关
where
方法的更多信息:

请记住,传递给
where
方法的是一个
闭包
,因此内部的代码不是预先执行的,也不一定在声明它的上下文中进行评估。你可以。不过,这也是一个有点高级的话题


(我简化了SQL查询以使它们更不可靠,如果您激活Hibernate或MySQL/您正在使用的其他DB的查询日志,您将看到它们更大)

为了说明Deigote的解释,下面是一个非常粗糙的WHERE查询生成器(实际上只是WHERE子句)实现,使用以下格式:

类生成器{
def条件=[]
def eq(列、值){

谢谢你的回答!第三段正是我昨天面对的情况!我曾怀疑类似的事情,但我不确定(当时)它是否有意义。我通过将
where
中的条件更改为类似
idI的内容来解决这个问题,我只需要返回一个
DetachedCriteria
,不带任何元素,我最初的想法是,如果我在闭包中有一个条件是
false
,那么它不会给我任何东西(不考虑对域类属性的任何引用)啊,我明白了。是的,为此您需要一个条件,该条件为false-但当应用于数据库中包含的行时为false:),与您在推荐(
id<0
)中提供的条件完全相同。
Domain.where {
    false
}.count()
class WhereBuilder {
    def conditions = []

    def eq(column, value) {
        conditions << [
            column: column, 
            operator: '=', 
            value: value]
    }

    def ne(column, value) {
        conditions << [
            column: column, 
            operator: '!=', 
            value: value]
    }

    String toString() {
        'WHERE ' << 
            conditions.collect { 
                "${it.column} ${it.operator} '${it.value}'"
            }.join(' AND ')
    }
}

def builder = new WhereBuilder()
builder.with {
    1 == 0
    false    
    eq 'firstName', 'John'
    ne 'lastName', 'Smith'
}

assert builder.toString() == "WHERE firstName = 'John' AND lastName != 'Smith'"