我想将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
}
答案 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)})
}
鉴于此
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)})