【问题标题】:GORM using foreign key instead of domain objectGORM 使用外键代替域对象
【发布时间】:2018-03-26 16:01:50
【问题描述】:

假设我有一个域对象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 域对象而是只传递作为 User 表上的外键的 Organization.Id 会很方便。

我希望我的代码如下所示:

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

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

【问题讨论】:

    标签: grails grails-orm


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您可以使用Criteria

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

      【讨论】:

        【解决方案3】:

        你有两个选择:

        1. 为您的User 类添加一个冗余的orgId 字段并将其用于 查找。
        2. 使用假对象进行查找:

        .

        Organization org = new Organization()
        org.id = 'someId' // looks strange, but you can not use id inside constructor
        def users = Users.findAllByOrganization org
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-11-11
          • 2012-07-29
          • 1970-01-01
          • 2012-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-05-03
          相关资源
          最近更新 更多