Критерии Grails проекции на соединяемую таблицу - PullRequest
9 голосов
/ 05 мая 2011

У меня проблема с построителем критериев Grails, я хочу сделать проекцию для столбца, который находится в таблице и имеет отношение «один ко многим» с примером родительской таблицы:

Car.createCriteria() { 
   projections { 
     property('name') 
     property('wheels.name')// ???? 
   }

   join 'wheels' 
   //or wheels {} ???
}

иличто-то подобное существует?Я думаю, что это основная проблема с псевдонимами

Ответы [ 2 ]

21 голосов
/ 05 мая 2011

Я предполагаю, что следующие классы домена:

class Car {
  String name
  static  hasMany = [wheels : Wheel]
}

class Wheel {
  String name
  static belongsTo = [car : Car]
}

Я также предполагаю, что это желаемый вывод:

CarName WheelName
Car1    Wheel1
Car1    Wheel2
Car2    Wheel3

В этом случае вы бы сделали это:

void testCarProjectionItg() {
  def car1 = new Car(name: 'Car1').save()
  def car2 = new Car(name: 'Car2').save()

  def wheel1 = new Wheel(name: 'Wheel1')
  def wheel2 = new Wheel(name: 'Wheel2')
  def wheel3 = new Wheel(name: 'Wheel3')

  car1.addToWheels wheel1
  car1.addToWheels wheel2     
  car2.addToWheels wheel3
  wheel1.save()
  wheel2.save()
  wheel3.save()
  car1.save()
  car2.save()

  println Wheel.withCriteria {
    projections {
      property('name')
        car {
          property('name')
        }
    }       
  }
}

--Output from testCarProjectionItg--
[[Wheel1, Car1], [Wheel2, Car1], [Wheel3, Car2]]

Я бы предпочел HQL-запрос в этом случае:

println Wheel.executeQuery("select car.name, wheel.name from Car car inner join car.wheels wheel")
--Output from testCarProjectionItg--
[[Car1, Wheel1], [Car1, Wheel2], [Car2, Wheel3]]
9 голосов
/ 13 июня 2012

что делать только:

Car.createCriteria().list() { 
    createAlias("wheels","wheelsAlias")
    projections { 
        property('name') 
        property('wheelsAlias.name')
    }
}

Или я что-то упустил?

...