【问题标题】:GORM: Query having subquery emptyGORM:子查询为空的查询
【发布时间】:2014-07-18 13:21:00
【问题描述】:

场景:

我有两个域 bean Book 和 Author。 Author 与 Book 具有一对多关联。

我想要今年没有出书的作者(这不是真实的情况:))

这是我的 MySQL 查询:

SELECT * FROM author AS a
WHERE 
(SELECT COUNT(b.id)
    FROM book AS b
    WHERE b.author_id = a.id
    AND b.releaseDate > '2014-01-01'
) = 0

如何将其转换为 Hibernate/Grails 标准

编辑:

  • 更明确地说:我需要等效的 Grails 标准。
  • 我有很多书籍和作者记录。 Gorm 查询必须是高性能的。

【问题讨论】:

    标签: mysql hibernate grails grails-orm


    【解决方案1】:

    这样的东西应该适合你;由于排序的原因,它可能会有点慢,但是如果您的书籍数量相对较少,它应该不会产生很大的影响。

    def targetDate = // define your date here.
    def lazyAuthors = Author.findAll{
       books.sort{it.requestDate}[books.size()-1] > targetDate
    }
    

    **EDIT**事实证明你不能查询瞬态,所以我最初的想法不会奏效,但是我用来获取最新书籍的技术应该可以。

    【讨论】:

    • 我尝试过,但 Grails 说:没有方法签名:grails.gorm.DetachedCriteria.mostRecentBook() 适用于参数类型:...(闭包)但是,即使它有效,我也担心性能:/
    • 好吧,我觉得很害羞,我会修改我的答案以反映此信息。
    • 不幸的是,我现在没有时间测试答案,但根据我对查询等的理解。这应该可以正常工作。
    • 谢谢。不幸的是,我有很多书籍和作者记录(我的错:我没有在我的问题中指定它;我编辑它)。但是我使用 HQL 解决了(请参阅我的答案)。
    【解决方案2】:

    我解决了,但没有使用标准。 我用的是 HQL:

    def authors = Author.findAll("\
    SELECT * FROM author AS a \
    WHERE \
    (SELECT COUNT(b.id) \
        FROM a.books AS b \
        WHERE b.releaseDate > '2014-01-01' \
    ) = 0")
    

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 1970-01-01
      • 2023-02-04
      • 2013-07-14
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多