我有以下域对象:
class User {
String name
Transaction transaction
static constraints = {
transaction nullable: true
}
}
class Transaction {
boolean successful
User user
static belongsTo = User
}
我想选择没有成功交易的所有users
。这意味着我希望没有任何事务的用户(transaction == null
)和具有成功值false
(transaction.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
。但我想要mike
和pablo
。我错过了什么?
答案 0 :(得分:8)
所以问题是它默认为内连接。您必须为表创建别名并定义其连接类型:
createAlias("transaction", "t", CriteriaSpecification.LEFT_JOIN)
or {
isNull("t")
eq("t.successful", false)
}