如何将Groovy对象的所有匹配属性分配给Java对象?

时间:2011-08-24 01:51:23

标签: groovy properties javabeans

我想将Groovy与JDBC一起使用来从表中加载一些数据。然后,我想要在属性名称匹配的位置复制属性。我怎么能在Groovy中做到这一点?

这样的事情:

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

        def e = new MyJavaClass()

        // copy matching fields from it to e

    }

def e = new MyJavaClass() // copy matching fields from it to e }

2 个答案:

答案 0 :(得分:3)

除了topchef的答案,你或许可以使用一些时髦的地图魔法

如果将sql限制为Java类中的属性(假设您可以一次将整个结果保存在内存中),那么您应该能够使用rows方法获取{{1 } List个对象(每行一个)。由于此类是GroovyRowResult的一个实例,因此groovy会将它用于construct your java object automatically

Map

答案 1 :(得分:1)

一些时髦的魔法有助于:

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

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

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

}

鉴于此

  • list filtered包含您要复制的所有属性名称;
  • 您的表列名称对应于MyJavaClass声明的属性名称(与列表filtered中相同);
  • MyJavaClass有默认(空)构造函数和构造函数 将所有属性作为参数;
  • MyJavaClass声明属性的公共setter;

E.g:

   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)})