Суть задачи - есть основной объект(ОО), связывающий все объекты в инфу, важную для пользователя. У ОО есть подчиненные таблицы(ПТ). Из них нужно вытащить актуальную инфу(например на какую-нибудь дату).
Первый вариант:
ОО:
static hasMany=[пт:ПТ]
static transents=[поле1]
пт поле1
public пт getПоле1() {
ПТ.find("запрос",[id])
}
В данном случае, идет запрос к транзитному полю и перекрытый get выдает нам результат.
Но как оказалось у данного метода есть минус - если использовать это поле
в таблице с сортируемым столбцом g:sortedColumn, то движок grails hibernate обратится к полю Поле1 в базе и естественно не найдя его там вызовет исключение.
Метод второй, кашерный! Найден мной в интернете(извиняюсь перед автором - забыл где), по сути представляет собой хак(или хук как в боксе) - formula.
static hasMany=[пт:ПТ]
String name
static constraint {
name :nullable true
}
static mapping {
name formula: "(select a.name from ПТ a WHERE a.ОО_id in(select b.id from ОО b.id=id) order by a.dateCreated LIMIT 1)"
}
Вот так.
Первый вариант:
ОО:
static hasMany=[пт:ПТ]
static transents=[поле1]
пт поле1
public пт getПоле1() {
ПТ.find("запрос",[id])
}
В данном случае, идет запрос к транзитному полю и перекрытый get выдает нам результат.
Но как оказалось у данного метода есть минус - если использовать это поле
в таблице с сортируемым столбцом g:sortedColumn, то движок grails hibernate обратится к полю Поле1 в базе и естественно не найдя его там вызовет исключение.
Метод второй, кашерный! Найден мной в интернете(извиняюсь перед автором - забыл где), по сути представляет собой хак(или хук как в боксе) - formula.
static hasMany=[пт:ПТ]
String name
static constraint {
name :nullable true
}
static mapping {
name formula: "(select a.name from ПТ a WHERE a.ОО_id in(select b.id from ОО b.id=id) order by a.dateCreated LIMIT 1)"
}
Вот так.
Комментарии
Отправить комментарий