假设有以下领域对象:
class Account{ Transaction transaction Date created } class Transaction{ Date date }
def c = Account.createCriteria() def now = new Date() def results = c.list { transaction {//查询关联的属性 between('date',now-10, now) } eq("transaction.id", 1 as Long)//如果是关联的id可以这样查询(many to one / one to one) }
def c = Account.createCriteria() def now = new Date() def results = c.list { eq("transaction.date", new Date())//运行时出错,关联除id外的属性不能这样查询 }
2.批量查询关联
batchSize: N,N是指查询关联的个数,而不是关联元素个数(当关联为集合时)。
class Person { String firstName Pet pet static mapping = { pet batchSize: 5//假如我们查询二十个Person对象,在第一次使用到pet时会一次查询出5个pet,对于集合的联系也是如此。 } }
class Account{ static hasMany = [transactions:Transaction] //Transaction transaction Date created static mapping = { transactions batchSize: 4 } } class Transaction{ static belongsTo = [account:Account] Date date }
def c = Account.createCriteria() def results = c.list { } results.each { println it.transactions }
在这里会查询出4个transactions集合,SQL语句有可能是:
select this_.id as id78_0_, this_.version as version78_0_, this_.created as created78_0_ from account this_ select transactio0_.account_id as account3_1_, transactio0_.id as id1_, transactio0_.id as id81_0_, transactio0_.version as version81_0_, transactio0_.account_id as account3_81_0_, transactio0_.date as date81_0_ from transaction transactio0_ where transactio0_.account_id in ( ?, ?, ?, ? )
3.约束
Grails的属性(包括many to one / one to one的关联)默认是不为空的