使用grails标准api定义OR条件

时间:2013-01-21 18:58:54

标签: grails gorm hibernate-criteria

我有以下域对象:

class User {
    String name
    Transaction transaction

    static constraints = {
        transaction nullable: true
    }
}

class Transaction {        
    boolean successful
    User user        
    static belongsTo = User
}

我想选择没有成功交易的所有users。这意味着我希望没有任何事务的用户(transaction == null)和具有成功值falsetransaction.successful == false)的事务的用户。我想使用Criteria API执行此操作(因为这可以与基于用户输入的其他条件结合使用)。

我试过了:

def c = User.createCriteria()
def results = c {
    or {
        isNull 'transaction'
        transaction {
            eq 'successful', false
        }
    }
}

但是,这只给了我有交易的用户(成功值false)。但我没有得到交易为null

的用户

以下代码显示了我如何创建一些示例数据:

def createUserAndTransaction(String name, Boolean successful = null) {
    User u = new User(name: name)
    if (successful != null) {
        Transaction t = new Transaction(user: u, successful: successful)
        u.setTransaction(t)
    }
    u.save()
}

def init = { servletContext ->
    createUserAndTransaction 'john', true
    createUserAndTransaction 'mike', false
    createUserAndTransaction 'pablo'
}

我的条件查询仅在这种情况下返回mike。但我想要mikepablo。我错过了什么?

1 个答案:

答案 0 :(得分:8)

所以问题是它默认为内连接。您必须为表创建别名并定义其连接类型:

createAlias("transaction", "t", CriteriaSpecification.LEFT_JOIN)

or {
    isNull("t")
    eq("t.successful", false)
}