2013-08-25 60 views
0

我面對這個(至少對我來說),有趣的任務SQL INSERT語句:從喜歡對象POJO得到一個SQL INSERT語句。讓我說我不需要在我的Scala應用程序和數據庫之間添加一個框架,因爲我只需要將數據插入到一個數據庫表中。斯卡拉:如何變換像對象POJO到使用Scala的反射

因此,假設我的類的屬性同樣命名這些數據庫表,我想使用Scala的反射,以得到一類像這樣的

class MyDataObj { 
    var a:Int = 345 
    var b:Boolean = false 
    var c:Double = 1243.98 
    var d:String = "A random string" 
} 

SQL插入這樣

INSERT INTO table_a (a, b, c, d) values (345, false, 1243.98, 'A random String'); 

好語句中,我們需要的是
1)訪問類的屬性
2)獲得的屬性類型
3)訪問對象實例

的屬性值爲了得到這樣的

List(("a","Int",345), ("b","Boolean",false), ("c","Double",1243.98), ...) 

,將很容易轉變成我們想要的。

到現在爲止,我剛剛發現瞭如何訪問屬性名稱

val columns = typeOf[MyDataObj].members.view.filter{_.isTerm}. 
       filter{!_.isMethod}.map{_.name}.toList 

我怎樣才能獲得其餘的我需要什麼?

像往常一樣支持我。

回答

1

在你的情況,你可以使用下面的代碼:

val o = new MyDataObj 
val attributes = o.getClass.getDeclaredMethods.filter { 
    _.getReturnType != Void.TYPE 
}.map { 
    method => (method.getName, method.getReturnType, method.invoke(o)) 
} 

這裏我用getDeclaredMethods獲得在MyDataObj的公共方法。您需要注意getDeclaredMethods無法在其父類中獲取方法。

MyDataObjgetDeclaredMethods將返回下面的方法:

public double MyDataObj.c() 
public boolean MyDataObj.b() 
public java.lang.String MyDataObj.d() 
public int MyDataObj.a() 
public void MyDataObj.c_$eq(double) 
public void MyDataObj.d_$eq(java.lang.String) 
public void MyDataObj.b_$eq(boolean) 
public void MyDataObj.a_$eq(int) 

所以我添加了一個過濾器來過濾掉無關的方法。

+0

非常感謝!這絕對是尋找什麼... – Max