Grails 搜索记录基于hasmany关系中的最新记录

Grails 搜索记录基于hasmany关系中的最新记录,grails,grails-domain-class,grails-2.3,Grails,Grails Domain Class,Grails 2.3,我有两个域名 class DomainA { String name Date dateCreated Date lastUpdated static transients = ['email'] static hasMany = [domainBs: DomainB] public String getEmail() { DomainB.mostRecentRecord(this).get()?.email } }

我有两个域名

class DomainA {
    String name
    Date dateCreated
    Date lastUpdated

    static transients = ['email']

    static hasMany = [domainBs: DomainB]

    public String getEmail() {
        DomainB.mostRecentRecord(this).get()?.email
    }
}

我的要求是获取所有域名以“M”开头的域名列表,并且最新的域名记录在其电子邮件属性中包含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)
    }
}
List listA=DomainA.findAllByNameIlike(“M%”)
列表列表B=[]
listA.each{entity->
DomainB DomainB=DomainB.mostRecentRecord(entity.get())
if(domainB&(domainB.email.contains('gmail')){
列表B.add(域B)
}
}
但它不允许分页和排序


有人能用
createCriteria
hql
或任何其他方式获取名称以“M”开头的所有域名的列表,并且最新域名在其电子邮件属性中包含gmail。

由于您正在查找最新的电子邮件,您需要查看在第二个域名上创建的最大日期。您可以使用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]) 
:只需点击第一个DomainController

        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%'])

在Grails2.4中,您应该能够使用新的关联子查询功能执行类似的操作:

DomainA.where {
    name like 'M%' && exists DomainB.where { 
        id == max(id).of { email like '%gmail%' }
    }
}

不幸的是,我无法在2.4中测试我们的应用程序,因此我无法确认这是否可行。

此查询每次都给我一个空列表。您有满足要求的数据吗?查询区分大小写。我几乎使用了您的域,构建了一些示例数据并进行了测试。今晚我将把代码签入github。我创建了名为
Manish
的DomainA实例和名为
Manish的DomainB实例test@gmail.com
和query给了我一个空列表。正在等待存储库。谢谢您的查询总是运行良好,我的缺点是尝试使用偏移量:5,但没有在DB中提供足够的数据。非常感谢您的时间和努力。我正在使用Grails2.3.5,您的查询给了我错误,我已经使用文档更正了这一点。你的询问给了我不正确的结果。它包括DomainA实例,其最近的DomainB是ot gmail,但在旧记录中有一个gamil。
DomainA.where {
    name like 'M%' && exists DomainB.where { 
        id == max(id).of { email like '%gmail%' }
    }
}