我有两个域名
class DomainA {
String name
Date dateCreated
Date lastUpdated
static transients = ['email']
static hasMany = [domainBs: DomainB]
public String getEmail() {
DomainB.mostRecentRecord(this).get()?.email
}
}
和
class DomainB {
String email
Date dateCreated
Date lastUpdated
static belongsTo = [domainA: DomainA]
static namedQueries = {
mostRecentRecord { domainA ->
eq 'domainA', domainA
order('dateCreated', 'desc')
maxResults(1)
}
}
}
我的要求是获取名称以" M"开头的所有DomainA的列表。最新的domainBs记录在其电子邮件属性中包含gmail。
我尝试了createCriteria
和hql
,但没有得到理想的结果,可能是我做错了。
以下是我当前的代码
List<DomainA> listA = DomainA.findAllByNameIlike("M%")
List<DomainB> listB = []
listA.each { entity ->
DomainB domainB = DomainB.mostRecentRecord(entity).get()
if (domainB && (domainB.email.contains('gmail'))) {
listB.add(domainB)
}
}
但它不允许分页和排序。
有人可能有任何想法获取名称以&#34; M&#34;开头的所有DomainA的列表。和最新的domainBs在其电子邮件属性中使用createCriteria
或hql
或任何其他方式包含gmail。
答案 0 :(得分:4)
由于您正在寻找最新的电子邮件,因此您需要查看第二个域上的最大日期。您可以使用HQL编写它并使用executeQuery传递您的分页参数。只需确保在dateCreated
上有索引即可。
FirstDomain.executeQuery("select fd from FirstDomain fd,SecondDomain sd where \
sd.firstDomain.id=fd.id and fd.name like :name and sd.email like :email \
and sd.dateCreated = (select max(sd2.dateCreated) from SecondDomain sd2 \
where sd2.firstDomain.id = fd.id))",
[email:'%gmail%',name:'M%'], [max: 10, offset: 0])
sample code:刚刚点击firstDomainController
def fd
// most recent email is gmail
fd = new FirstDomain(name:"Mtest")
fd.addToSecondDomain(new SecondDomain(email:'yahoo.com'))
fd.addToSecondDomain(new SecondDomain(email:'gmail.com'))
fd.save(flush:true)
// most recent is yahoo
fd = new FirstDomain(name:"MMtest")
fd.addToSecondDomain(new SecondDomain(email:'gmail.com'))
fd.addToSecondDomain(new SecondDomain(email:'yahoo.com'))
fd.save(flush:true)
// will return "Mtest"
FirstDomain.executeQuery("select fd from FirstDomain fd,SecondDomain sd where sd.firstDomain.id=fd.id and fd.name like :name and sd.email like :email and sd.dateCreated = (select max(sd2.dateCreated) from SecondDomain sd2 where sd2.firstDomain.id = fd.id))",[email:'%gmail%',name:'M%'])
答案 1 :(得分:1)
在Grails 2.4中,你应该能够使用新的相关子查询功能做这样的事情:
DomainA.where {
name like 'M%' && exists DomainB.where {
id == max(id).of { email like '%gmail%' }
}
}
不幸的是,我还没能在2.4中测试我们的应用程序,所以我无法确认这是否有效。