2011-07-26 7 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.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을 발생시킵니다. 제품 (지도 맵)을 무시하면이 동작을 변경할 수 있습니다. –

관련 문제