将HQL转换为标准

时间:2011-04-05 20:47:31

标签: hibernate grails hql criteria

我在HQL中有一个完全有效的查询。但是,我想在标准表格中表达它,这更容易阅读和维护。

这就是场景:我有工人,人和付款。工人是一个人加一个工作类型(在这个应用程序中,一个人可以是两个同时具有不同工作类型的工人)。付款很多,一个工人可能不止一个。我需要让每个工人一次,然后是该工人的所有付款值的总和。这些是HQL查询:

1-获取所有付款:

Payment.findAll("from Payment as p where p.month = :m and p.year = :y group by p.worker.id, p.worker.person.id", [m: paymentsMonth, y: paymentsYear])

2-迭代付款,对于每一个我都以这种方式得到该工人的付款总额(这是付款):

def totalLiquidValue = Payment.executeQuery('''select sum(liquidValue) from Payment where
                                                month = :m and
                                                year = :ar and
                                                worker = :w''',
                                                [m: it.paymentMonth, ar: it.year, w: payment.worker])
                                                .first()

它有效,但不是我试图写的替换它的标准:

1-

def payments = Payment.withCriteria {
                    worker {

                        projections {
                            groupProperty('jobType')
                        }

                        person {
                            projections {
                                groupProperty('id')
                            }
                        }
                    }

                    eq('month', paymentsMonth)
                    eq('year', paymentsYear)
                }

在“字段列表”中出现“com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:未知列'person_ali2_.msid'失败”

'msid'实际上是数据库中'id'字段的名称。这是通过在域类Worker中映射id来完成的。

你看到了什么新的可能性吗?

由于

更新

我们需要使用客户端提供的旧数据库。为了更好地组织,我们从它们中使用的类被表示为视图,名为“legacy_tablename”,并且我们系统中的所有内容都在一个单独的数据库中,因此视图引用其他数据库中的表而我们不需要处理代码中的多个数据库。这就是为什么有时会指定表名。

域类很大,但这些是关于它们的重要细节:

class Payment{

    Integer year
    Integer month

    Worker worker

    BigDecimal liquidValue

}

class Worker {
    Person person
    Integer jobType

    static mapping = {
      table("legacy_worker")
      id(composite: ["jobType", "person"])
      person(column: "msid", fetch: "join")
    }     
}

class Person {
    String id

    static mapping = {
       table("legacy_person")
       id(column:"msid", generator: "assigned")
    }
}

由于

1 个答案:

答案 0 :(得分:0)

      def payments = Payment.withCriteria {
           createAlias('worker','w')
           projections {
               property('w.id')  
               groupProperty('w.jobType')
               groupProperty('w.person')                       
            }
            eq('month', paymentsMonth)
            eq('year', paymentsYear)
        }

上面的查询会给你列表,第一个元素是worker,第二个是jobType,第三个是给出月份和年份的人物对象。

  def payments = Payment.withCriteria {
            projections {
             sum('liquidValue')
            }   
            eq('month', paymentsMonth)
            eq('year', paymentsYear)
            eq('worker',worker)
        }