Grails Hql或从组中选择具有最大值的行的条件
我需要编写一个标准或HQL,为每个interfaceCode只选择最新版本的InterfaceVersion。版本由majorVersion.minorVersion.editVersion组成 例如: 界面外翻表:Grails Hql或从组中选择具有最大值的行的条件,grails,hql,gorm,criteria,Grails,Hql,Gorm,Criteria,我需要编写一个标准或HQL,为每个interfaceCode只选择最新版本的InterfaceVersion。版本由majorVersion.minorVersion.editVersion组成 例如: 界面外翻表: id | interface_code_id | major_version | minor_version | edit_version ---|-------------------|---------------|---------------|-------------
id | interface_code_id | major_version | minor_version | edit_version
---|-------------------|---------------|---------------|-------------
1 | 1 | 1 | 1 | 6
2 | 1 | 1 | 5 | 0
3 | 2 | 1 | 0 | 0
4 | 2 | 0 | 1 | 0
5 | 2 | 2 | 0 | 1
6 | 2 | 1 | 3 | 6
预期结果将是:
InterfaceVersions instances with ids [2, 5]
我已将此GORM域类简化:
InterfaceCode{
int id
String code
static hasMany = [ versionList: InterfaceVersion]
}
InterfaceVersion{
int id
InterfaceCode interfaceCode
int majorVersion
int minorVersion
int editVersion
static belongsTo = [ InterfaceCode ]
static constraints = {
interfaceCode(unique:['majorVersion','minorVersion','editVersion'])
}
}
到目前为止,我已经能够提出以下sql:
SELECT t1.*
FROM Interface_Version t1
Left Outer Join Interface_Version T2
On (T1.Interface_Code_Id = T2.Interface_Code_Id And
(T1.Major_Version < T2.Major_Version Or
(T1.Major_Version = T2.Major_Version And T1.Minor_Version < T2.Minor_Version) Or
(T1.Major_Version = T2.Major_Version And T1.Minor_Version = T2.Minor_Version And T1.Edit_Version < T2.Edit_Version ) )
)
WHERE t2.id IS NULL
你能不能把这个sql转换成hql或Criteria,或者想出更好的方法?我搞不懂,你说的最新版本是什么意思?你能提供一个简单的例子吗?我在问题中添加了一个例子,所以最新的版本是基于major_version字段的?如果有版本1.1.5和1.1.1,而最新的版本是1.1.5,那么你需要所有三个版本major、minor、edit来找出哪个interfaceVersion实例是最新的。如果你已经使用的SQL,我会简单地使用它。它不会像HQL或Criteria那样为您返回hibernate域对象。如果您需要域对象本身,我会将您的查询放在一个服务中,以找到您想要的对象的ID,然后将它们作为域对象获取。一些阅读:和