GORM中是否存在'不在'等价物?

时间:2010-08-06 10:45:07

标签: grails gorm

这可以在createCriteria()中转换吗?

SELECT * FROM node WHERE (node.type = 'act' AND nid NOT IN (SELECT nid FROM snbr_act_community)) LIMIT 10

我知道有一个'in'运算符,这是我到目前为止所拥有的:

def c = VolunteerOpportunity.createCriteria()
def matchingActs = c.list {
    node {
        eq('type', 'act')
    }
    maxResults(10)
}

只想看看这是否可行。否则,我想这在HQL中是可能的吗?

5 个答案:

答案 0 :(得分:19)

感谢Sammyrulez的代码。从中得到了一个想法。测试了它,但没有用。我修好了,这是最终的工作代码:

def ids = [14400 as long, 14401 as long]

def c = VolunteerOpportunity.createCriteria()
def matchingActs = c.list {
    node {
        eq('type', 'act')
        not { 'in'(ids) }
    }
    maxResults(10)
}

现在我知道如何使用'not'运算符。非常感谢!

答案 1 :(得分:8)

我自己没试过,但是看看Grails doc和hibernate api,你可以使用Hibernate Criteria API 1的Restrictions类中的静态方法在这个构建器映射上创建节点。像

这样的东西
 def c = VolunteerOpportunity.createCriteria()
def matchingActs = c.list {
    node {
        not(in('propertyName', ['val1','val2']))
    }
    maxResults(10)
}

因为你使用not方法链接in方法(返回Criterion)(以Criterion作为参数并返回否定版本)

答案 2 :(得分:1)

这是解决方案:

def resultat=EnteteImputationBudgetaire.createCriteria().get{
            between("dateDebutPeriode", dateDebut, dateFin)

            and{ eq 'natureImputationBudgetaire','FONCTIONNEMENT'  }
            maxResults(1)
        }

        def resultat2=ParametragePlanBudgetaire.createCriteria().list() {
            like('composantBudgetaire','6%')
            if(resultat?.details) {
                not {
                    'in'('composantBudgetaire',resultat?.details?.imputationBudgetaire)
                }
            }
        }

答案 3 :(得分:1)

根据Grails有关创建条件here的文档,您可以使用以下内容:

not {'in'("age",[18..65])}

在此示例中,您有一个名为"age"的属性,并且您希望获得不在18到65之间的行。当然,[18..65]部分可以替换为任何值列表或你需要的范围。

答案 4 :(得分:1)

记住:在这种情况下,您不必使用括号,您可以使用@import "lib/bourbon/app/assets/stylesheets/bourbon"; // example of bourbon mixin usage a.tooltip-anchor + .tooltip:after { content: ""; position: relative; top: -12px; @include triangle(6.5em 2.5em, #FF0000, down); } ,例如:

inList