【问题标题】:How can I refer to the "this" object in a Grails criteria query如何在 Grails 条件查询中引用“this”对象
【发布时间】:2011-05-04 05:31:10
【问题描述】:

我有一组相关的域对象,如下所示:

class Book {
    static belongsTo = [author: Author]
}

class Contract {
    static belongsTo = [author: Author]
    Book book
}

class Author {
     static hasMany = [books: Book, contracts: Contract]
}

我想创建一个查询,该查询将与一本书的所有作者合同相结合,其中合同书是“这本书”。我想回答的问题是“合同中的所有书籍是什么?”这是我的标准,但我不知道如何引用“this”对象:

Book.createCriteria().list() {
    author {
        contracts {
            eqProperty('book', '??') // what here??
        }
    }
}

我可以引用“this”对象或以某种方式为其创建别名吗?

【问题讨论】:

标签: hibernate grails groovy criteria grails-orm


【解决方案1】:

如果没有在这台机器上运行 grails 版本,我无法测试它的语法。

您可以执行以下操作: 将“import org.hibernate.FetchMode as FM”添加到您的控制器或服务中

Contract.withCriteria{
    createAlias('book','b')
    fetchMode('book',FM.EAGER)
}.book.unique()

【讨论】:

    【解决方案2】:

    是否可以选择直接 HQL,而不是使用 Criteria builder?我在 HQL 方面不是最流利的,但也许您可以这样做:

    // should return a collection of Books
    Contract.executeQuery('select distinct c.book from Contract c')
    

    如果您需要它用于特定作者,您可以相应地添加 where 子句 (docs)。

    【讨论】:

    【解决方案3】:

    没有写单元测试,但我认为你可以这样做..

    GORM Documentation 向下滚动到 Eager fetching 示例以查看示例

    Book.createCriteria().list() {
        author {
            contracts {
                eqProperty('book.id', book.id) // what here??
            }
        }
    }
    

    【讨论】:

    • 关闭,但这并不像我希望的那样工作。 eqProperty 采用两个属性名称。我可以使用eq 来查找一本特定的书,但我正试图让它加入书和书之间的连接。
    • @ataylor 你试过用'eq'而不是'eqProperty'
    • 那也没用。这不是我想要找到的特定书籍,而是我想加入书桌。不过感谢您的建议。
    • @ataylor - 你的问题是你试图回答“这本书有合同吗?”。您是否真的在尝试回答“合同中的所有书籍是什么”?
    • @Rob Hruska 是的,这就是我的意思。好点,我已经更新了问题。
    猜你喜欢
    • 1970-01-01
    • 2011-09-13
    • 2011-04-26
    • 2015-07-01
    • 2015-10-08
    • 2012-03-26
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多