我想用Groovy和JDBC从表中加载一些数据。然后我想要复制属性名称匹配的属性。我如何在Groovy中做到这一点?如何将Groovy对象的所有匹配属性分配给Java对象?
事情是这样的:
sql.eachRow("select * from temp_table") {
def e = new MyJavaClass()
// copy matching fields from it to e
}
我想用Groovy和JDBC从表中加载一些数据。然后我想要复制属性名称匹配的属性。我如何在Groovy中做到这一点?如何将Groovy对象的所有匹配属性分配给Java对象?
事情是这样的:
sql.eachRow("select * from temp_table") {
def e = new MyJavaClass()
// copy matching fields from it to e
}
除了topchef的回答,你可能会使用一些常规的地图mag IC
如果你限制你的SQL到您的Java类的属性(假设你可以保留在内存中一次整个结果),那么你就应该能够使用rows
方法获取GroovyRowResult
的List
一个对象(每行一个)。由于这个类是Map
的一个实例,Groovy将使用它来为您construct your java object automatically:
class MyJavaClass {
String property1, property2, property3
}
sql.rows("select property1, property2, property3 from temp_table").each { row ->
MyJavaClass e = row
}
一些常规魔法帮助:
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)})