Для (1) и (2) я не знаю, есть ли способ сделать то, что вы хотите, с помощью только одного критерия запроса, но альтернативный способ кажется более простым и естественным. Для (1):
def car = Car.get(carId)
def owners = car.owner?.name
Для (2)
def person = Person.get(personId)
def cars = person.cars*.name
О (3), это своего рода проблема дизайна здесь. Ваш текущий дизайн домена не отражает правило, которое вы описываете, поэтому будет трудно поддерживать это ограничение. Вы можете рассмотреть отображение таблицы PersonOrganization и сделать childrenOrganization временным свойством . Например:
class Organization {
int id
String name
Organization parent
static transients = ['children']
...
Boolean children() {
def children = Organization.createCriteria().list() {
eq ('parent', this)
}
return children
}
}
После этого вы можете использовать функцию трассировки, такую как getAllAncestors (), чтобы определить всю родительскую иерархию организации, найти ее в списке человек-организация. Это кажется не лучшим способом, но это возможный путь.