GORM使用外键而不是域对象

时间:2018-03-26 16:01:51

标签: grails gorm

假设我有一个包含User字段的域对象Organization。我可以使用外键映射它,让hibernate像这样处理剩下的事情:

class User {

    String id
    String firstName
    Organization organization

    static mapping = {
        table 'user'
        id column: "user_id", generator:'assigned'
        organization column: 'organization_Id'
    }
}

class Organization {

    String id
    String name
    String address

    static mapping = {
        table 'organization'
        id column: "organization_id", generator:'assigned'
    }
}

这很好用,但是当我想查询组织中的所有用户时,我可能需要做这样的事情

String orgId = "some id"
Organization org = Organization.findById(orgId)
List<User> users = User.findAllByOrganization(org)

不必传递Organization域对象,而只是传递Organization.Id,这是User表上的外键。

我希望我的代码看起来如下:

String orgId = "some id"
List<User> users = User.findAllByOrganization(orgId)

经过研究,似乎这是不可能的,我需要首先查询Organization,然后使用该对象。有没有我不知道的方式?

3 个答案:

答案 0 :(得分:3)

我喜欢这样做的一种方法是使用域对象的代理而不是它的水合实例。您可以使用load()获取代理。这意味着只要您不访问id之外的任何域对象属性,就不会进行数据库调用。

def users = Users.findByOrganization(Organization.load(orgId))

答案 1 :(得分:1)

您可以使用Criteria

String orgId = "some id"

List<User> users = User.createCriteria().list {
    organization {
      idEq(orgId)
    }
}

答案 2 :(得分:1)

您有两种选择:

  1. 向您orgId类添加一个冗余的User字段并将其用于。{ 查找。
  2. 使用虚假对象进行查找:
  3. Organization org = new Organization()
    org.id = 'someId' // looks strange, but you can not use id inside constructor
    def users = Users.findAllByOrganization org