2011-07-26 10 views
1

SQLコールを介してオブジェクトのセットをロードしようとしています。 SQLクエリは、必要以上に多くのプロパティを返します。 SQLクエリの修正以外。製品の宣言時に、余計なパラメータをすべて無視するにはどうすればよいですか?必要以上のプロパティの処理

import groovy.sql.Sql 

class Product { 
    Integer id; 
    Integer type; 
    String unique; 
} 

def var = []; 
sql = Sql.newInstance("jdbc:jtds:sqlserver://localhost/[DB]", "user", "password","net.sourceforge.jtds.jdbc.Driver"); 
sql.eachRow("select * from Products", { var << new Product(it.toRowResult()) }); 

私は例外を取得しています:

groovy.lang.MissingPropertyException: No such property: [other fields from the SQL result] 

答えて

1

デフォルトGroovyの行動はあなたが豆に存在しないプロパティに値を設定しようとするたびgroovy.lang.MissingPropertyExceptionを投げることです。私はあなたがその行動を変えることができるかどうかは確信していません。ただし、存在しないプロパティをフィルタリングするヘルパーメソッドを記述することもできます。

def filterResult(bean, row) { 
    def filteredProps = [:] 

    row.each { key, value -> 
     if(bean.metaClass.properties.find { prop -> prop.name == key }) { 
      filteredProps.put(key, value) 
     } 
    } 

    filteredProps 
} 

def var = [] 

sql.eachRow("select * from Products", { 
    var << new Product(filterResult(Product, it.toRowResult())) 
}) 
+0

確かに意味があります。しかし、プロパティは、直接的な1対1のバインディングではなく、入ってくるハッシュマップに格納されていると想像しました。それで、余分なプロパティが問題を引き起こすことは私には意味がありません。私はここで間違っていますか? Groovyは、十分な情報を持っている場合にだけ、すべてのプロパティを満たさない場合には不平を言うことはありません。 – monksy

+0

デフォルトでは、Groovyは実際にマップエントリをクラス内のプロパティにバインドします。したがって、余分なキーはgroovy.lang.MissingPropertyExceptionになります。製品(マップマップ)をオーバーライドすると、この動作を変更できます。 –

関連する問題