gpt4 book ai didi

grails - 根据 hasman 关系中的最新记录搜索记录

转载 作者:行者123 更新时间:2023-12-02 06:41:09 25 4
gpt4 key购买 nike

我有两个域

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”开头且最新的domainBs记录在其电子邮件属性中包含gmail的所有DomainA的列表。

我尝试了createCriteriahql但没有得到想要的结果,可能是我做错了什么。

以下是我当前的代码

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)
}
}

但它不允许分页和排序。

有人可以使用 createCriteriahql 或任何方法获取名称以“M”开头的所有 DomainA 的列表,并且最新的 domainB 在其电子邮件属性中包含 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])

sample code :只需点击第一个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%'])

关于grails - 根据 hasman 关系中的最新记录搜索记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23262578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com