Как назначить все подходящие свойства из объекта Groovy для объекта Java? - PullRequest
0 голосов
/ 24 августа 2011

Я хочу использовать Groovy с JDBC для загрузки некоторых данных из таблицы. Затем я хочу скопировать свойства туда, где совпадают имена свойств. Как я могу сделать это в Groovy?

Примерно так:

sql.eachRow("select * from temp_table") {</p> <pre><code> def e = new MyJavaClass() // copy matching fields from it to e }

Ответы [ 2 ]

3 голосов
/ 24 августа 2011

В дополнение к ответу topchef, вы можете использовать магическую карту Groovy

Если вы ограничите свой sql свойствами в своем классе Java (и при условии, что вы можете хранить весь результат в памяти сразу), тогда вы сможете использовать метод rows, чтобы получить List из GroovyRowResult объектов (по одному на строку).Поскольку этот класс является экземпляром Map, groovy будет использовать его для автоматического создания вашего Java-объекта для вас:

class MyJavaClass {
  String property1, property2, property3
}

sql.rows("select property1, property2, property3 from temp_table").each { row ->
   MyJavaClass e = row
}
1 голос
/ 24 августа 2011

Немного заводной магии помогает:

def filtered = ['property1', 'property2', ....]

sql.eachRow("select * from temp_table") {

        def e = new MyJavaClass(it.properties.findAll{filtered.contains(it.key)})

}

Учитывая, что

  • список filtered содержит все имена свойств, которые вы собираетесь копировать;
  • имена столбцов вашей таблицы соответствуют MyJavaClass объявленным именам свойств (так же, как в списке filtered);
  • MyJavaClass имеет как конструктор по умолчанию (пустой), так и конструктор который принимает все свойства в качестве параметров;
  • MyJavaClass объявляет открытые сеттеры для свойств;

например:

   public MyJavaClass() {}

   public MyJavaClass(String property1, String property2, ....) {
       this.property1 = property1;
       this.property2 = property2;
       .... }

   public void setProperty1(String property1) {this.property1 = property1;}
   public void setProperty2(String property2) {this.property2 = property2;}
   ....

Вы можете использовать filtered в качестве списка нежелательных свойств, таких как:

def filtered = ['class', 'metaClass', ....]

, то:

def e = new MyJavaClass(it.properties.findAll{!filtered.contains(it.key)})
...