У меня есть запрос на 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")
}
}
Спасибо