Grails 查询:获取关联对象的列表
Grails query: Get list of associated objects
我有一个多对多的关系:
class Project {
Set<PrincipalInvestigator> pis
:
static hasMany = [ pis:PrincipalInvestigator ]
}
class PrincipalInvestigator {
String name
:
}
我想要一个查询 returns 属于预定义项目列表的唯一且排序的 PI 列表。
一种天真的方法是遍历项目,遍历他们的 PI 列表,同时删除重复项。执行此操作的代码很简单,但速度很慢。
到目前为止,我能想到的最佳解决方案是:
def pi_ids = Project.createCriteria().list{ // find unique list of PI IDs
// project filters here, not relevant to the question
createAlias('pis', 'aka_pis', JoinType.LEFT_OUTER_JOIN)
isNotNull('aka_pis.id')
projections {
distinct('aka_pis.id')
}
}
def pi_list = PrincipalInvestigator.createCriteria().list{ // get PIs from list of IDs
inList('id', pi_ids)
order('name', 'asc')
}
我的解决方案快了一个数量级,但它仍然是 2 个不同的查询。有没有办法在单个查询中获得相同的结果?
使用executeQuery
使查询变得更容易。以下内容应该有效:
PrincipalInvestigator.executeQuery("select distinct p.pis from Project p where p.id in :projectIds",
[projectIds: [1,2,3]])
我的问题的解决方案是这个 HQL:
PrincipalInvestigator.executeQuery(
"select distinct pi from Project p inner join p.pis as pi where p.id in :projectIds order by pi.name",
[projectIds:[1,2,3]])
此解决方案允许对不同的结果进行排序,并且内部联接会修剪所有空实例。感谢 cfrick 让我走上正轨。
我有一个多对多的关系:
class Project {
Set<PrincipalInvestigator> pis
:
static hasMany = [ pis:PrincipalInvestigator ]
}
class PrincipalInvestigator {
String name
:
}
我想要一个查询 returns 属于预定义项目列表的唯一且排序的 PI 列表。
一种天真的方法是遍历项目,遍历他们的 PI 列表,同时删除重复项。执行此操作的代码很简单,但速度很慢。
到目前为止,我能想到的最佳解决方案是:
def pi_ids = Project.createCriteria().list{ // find unique list of PI IDs
// project filters here, not relevant to the question
createAlias('pis', 'aka_pis', JoinType.LEFT_OUTER_JOIN)
isNotNull('aka_pis.id')
projections {
distinct('aka_pis.id')
}
}
def pi_list = PrincipalInvestigator.createCriteria().list{ // get PIs from list of IDs
inList('id', pi_ids)
order('name', 'asc')
}
我的解决方案快了一个数量级,但它仍然是 2 个不同的查询。有没有办法在单个查询中获得相同的结果?
使用executeQuery
使查询变得更容易。以下内容应该有效:
PrincipalInvestigator.executeQuery("select distinct p.pis from Project p where p.id in :projectIds",
[projectIds: [1,2,3]])
我的问题的解决方案是这个 HQL:
PrincipalInvestigator.executeQuery(
"select distinct pi from Project p inner join p.pis as pi where p.id in :projectIds order by pi.name",
[projectIds:[1,2,3]])
此解决方案允许对不同的结果进行排序,并且内部联接会修剪所有空实例。感谢 cfrick 让我走上正轨。