Преобразование HQL в критерии - PullRequest
0 голосов
/ 06 апреля 2011

У меня есть запрос на 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.

Видите ли вы какие-либо новые возможности?

Спасибо

Обновление:

Нам нужно использовать наследиебазы данных, предоставленные клиентом.Для лучшей организации используемые нами классы представляются в виде представлений с именем «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 голосов
/ 06 апреля 2011
      def payments = Payment.withCriteria {
           createAlias('worker','w')
           projections {
               property('w.id')  
               groupProperty('w.jobType')
               groupProperty('w.person')                       
            }
            eq('month', paymentsMonth)
            eq('year', paymentsYear)
        }

Приведенный выше запрос даст вам список списков, где 1-й элемент будет рабочим, 2-й - jobType, а 3-й - личный объект с указанием месяца и года.

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