【问题标题】:Grails many-to-one expose id without lazy load?Grails 多对一公开 id 而没有延迟加载?
【发布时间】:2011-07-26 21:29:19
【问题描述】:

Grails - 如何在不强制加载整个对象的情况下公开多对一关联属性的 id?

class Task {
  User belongsTo
  User createdBy
}
class User {
  ...
}

我能否从 Task 获取用户 ID,而不会导致整个用户对象的延迟加载?一般有没有办法做到这一点,还是会涉及每个类的自定义查询?这实际上涉及通过 BlazeDS 返回的 DTO 对象——我需要的只是 id,而不是关联的对象。

【问题讨论】:

    标签: grails associations lazy-evaluation many-to-one


    【解决方案1】:

    Grails 默认启用了惰性关联,因此您不必担心所有链接对象的加载,除非您启用急切获取。此外,您可以使用命名查询或休眠标准预测: 例如

     def taskCriteria = Task.createCriteria()  
     def users = taskCriteria.list{//or get
         projections {
             property "id"
         } 
         user{
             eq("userName", "Joe")
         }   
     }
    

    上面将只为名为 Joe 的用户提取任务的 ID。

    【讨论】:

    • 我想做的是将域对象映射到 dto 中,用 id 代替关联的类对象(在某些情况下)。我想依靠休眠来获取初始域对象。例如,我可以通过引用“createdBy.id”将 User 子类 id 放入 dto。但是,这会导致获取整个用户对象,而我只需要 id。我知道延迟加载代理可以访问 id,显然,因为这是获取的关键。我想访问该 id 而不会导致获取。
    • 我明白你的意思,我确定你看过 Grails 的 DTO 插件。您是否考虑过命名查询?你可以在预测中使用它:grails.org/doc/latest/ref/Domain%20Classes/namedQueries.html 除了你必须参考休眠文档:docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single
    【解决方案2】:

    显然您需要使用魔术符号 belongsToId 和 createdById - 请参阅GRAILS-2570

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多