基于动态关联的GORM hibernate条件查询

基于动态关联的GORM hibernate条件查询,hibernate,grails,gorm,Hibernate,Grails,Gorm,我有一个GORM域对象,它通过两个不同的列与另一个对象关联。我试图通过一对嵌套联接获取一些数据。我决定将查询一分为二,而不是加入两次并使返回的行数以指数方式增加 是否有一种方法可以动态指示您要查询的列?换句话说,有没有可能把这段代码 Set<Template> templates = new HashSet<Template>() templates.addAll(Template.createCriteria().list { eq 'isActive',true

我有一个GORM域对象,它通过两个不同的列与另一个对象关联。我试图通过一对嵌套联接获取一些数据。我决定将查询一分为二,而不是加入两次并使返回的行数以指数方式增加

是否有一种方法可以动态指示您要查询的列?换句话说,有没有可能把这段代码

Set<Template> templates = new HashSet<Template>()
templates.addAll(Template.createCriteria().list {
  eq 'isActive',true
  eq 'allowCustomerRequest',true
  buyer {
    companyUsers {
      eq 'userId',userId
    }
  }
})
templates.addAll(Template.createCriteria().list {
  eq 'isActive',true
  eq 'allowCustomerRequest',true
  seller {
    companyUsers {
      eq 'userId',userId
    }
  }
})
Set templates=newhashset()
templates.addAll(Template.createCriteria().list{
eq‘isActive’,正确
等式“allowCustomerRequest”,为真
买主{
公司用户{
eq“userId”,userId
}
}
})
templates.addAll(Template.createCriteria().list{
eq‘isActive’,正确
等式“allowCustomerRequest”,为真
卖方{
公司用户{
eq“userId”,userId
}
}
})
把它缩短成这样

Set<Template> templates = new HashSet<Template>()
['buyer','seller'].each{ who ->
  templates.addAll(Template.createCriteria().list {
    eq 'isActive',true
    eq 'allowCustomerRequest',true
    who {
      companyUsers {
        eq 'userId',userId
      }
    }
  })
}
Set templates=newhashset()
[‘买方’、‘卖方’]各{who->
templates.addAll(Template.createCriteria().list{
eq‘isActive’,正确
等式“allowCustomerRequest”,为真
谁{
公司用户{
eq“userId”,userId
}
}
})
}
编辑 正如@dmahapatro所指出的,可以在一个查询中实现这一点,但是我认为这样做会增加相当多的行数。下面是一个执行多重联接的示例

Set<Template> templates = new HashSet<Template>()
templates.addAll(Template.createCriteria().listDistinct {
  eq 'isActive',true
  eq 'allowCustomerRequest',true
  or{
    buyer {
      companyUsers {
        eq 'userId',userId
      }
    }
    seller {
      companyUsers {
        eq 'userId',userId
      }
    }
  }
})
Set templates=newhashset()
templates.addAll(Template.createCriteria().listDistinct{
eq‘isActive’,正确
等式“allowCustomerRequest”,为真
或{
买主{
公司用户{
eq“userId”,userId
}
}
卖方{
公司用户{
eq“userId”,userId
}
}
}
})

在单个条件查询中对
买方
卖方
进行左联接应该可以解决问题,对吧?@dmahapatro是的,我可以在单个条件中进行左联接,但它会成倍地增加返回的行数。可以通过listDistinct筛选出重复项。但我受到了另一位开发人员的批评,他说他的VPN连接花费了太长时间P