【问题标题】:Grails query: Get list of associated objectsGrails查询:获取关联对象列表
【发布时间】:2015-02-24 17:50:43
【问题描述】:

我有一个多对多的关系:

class Project {
    Set<PrincipalInvestigator> pis
     :

    static hasMany = [ pis:PrincipalInvestigator ]
}

class PrincipalInvestigator {
    String name
     :
}

我想要一个返回唯一且排序的 PI 列表的查询,这些 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 个不同的查询。有没有办法在单个查询中获得相同的结果?

【问题讨论】:

    标签: grails grails-orm hibernate-criteria


    【解决方案1】:

    使用executeQuery 使查询变得更容易。以下内容应该可行:

    PrincipalInvestigator.executeQuery("select distinct p.pis from Project p where p.id in :projectIds", 
        [projectIds: [1,2,3]])
    

    【讨论】:

    • 谢谢。您如何使 PI 列表独一无二(编辑“选择不同的”)并正确排序?
    【解决方案2】:

    我的问题的解决方案是这个 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 让我走上正轨。

    【讨论】:

      猜你喜欢
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-06
      • 1970-01-01
      • 2014-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多