mysql
  • grails
  • hql
  • criteria
  • 2016-01-08 20 views 0 likes 
    0

    我知道我可以在标准使用MySQL功能如下多种功能:Grails的标准 - 在同一领域

    Number rating = Book.createCriteria().get 
         eq("author", author) 
         projections { 
          max rating 
         } 
    } 
    

    执行的

    select max(rating) from book where author = 'authors name'; 
    

    相当于但是,如果这个等级可以是积极的或负数,我想绝对最大,是否有可能在标准中执行以下内容:

    select max(Abs(rating)) from book where author = 'authors name' 
    

    也许我需要恢复到HQL,但只是想看看这是我能做的事情。

    回答

    2

    个人而言,我把它改写为HQL

    def result = Book.executeQuery(
        "select max(abs(rating)) from Book where author = :author", [author: author]) 
    

    您可以通过sqlRestriction使用SQL在条件查询的谓词,但我不认为这是可能的projections使用它们。

    0

    还是在普通的SQL:

    def rating = new groovy.sql.Sql(datasource).firstRow("select max(Abs(rating)) rating from book where author = ${author.name}")?.rating 
    
    +0

    感谢@defectus,但正如问题中提到的那样,在恢复到HQL之前正在查看是否有使用Criteria的解决方案。 – dre

    +1

    我知道我只是试图有点有趣。但是,如果你只有一个锤子(或者'Hibernate'),那么所有东西看起来都像钉子(或者'Criteria'):-) – defectus

    1

    我认为最干净的方法是将公式添加到Book类:

    class Book { 
        Integer rating 
        Integer absRating 
        ... 
    
        static mapping = { 
         absRating formula: 'ABS(RATING)' 
        } 
    } 
    

    然后用你的标准内absRating

    Number rating = Book.createCriteria().get 
         eq("author", author) 
         projections { 
          max absRating 
         } 
    } 
    

    链接:Derived Properties

    +0

    可能有点矫枉过正,因为我只需要使用它一次就可以编辑域对象整个应用程序,我想我需要使用HQL,如果不可能的话。 – dre

    +0

    诚然,这是一个判断的呼吁。就我个人而言,我认为我会使用它,因为我更喜欢HQL上的createCriteria语法,但我知道它最终会生成相同的SQL,因此它是一种无理性的不喜欢。 – tylerwal

    相关问题