2011-08-10 4 views
1

내가 jrxml

<parameter name="param_value" class="java.lang.String" isForPrompting="false"> 
    <defaultValueExpression><![CDATA[(" where $X{IN, country,country_param}")]]> </defaultValueExpression> 
</parameter> 

<queryString> 
    <![CDATA[select user_id from user_profile $P{param_value}]]> 
</queryString> 

이 같은 쿼리 문자열 외부 $의 X를 {} 사용하기 위해 노력하고있어하지만 param_value을 평가하는 동안 오류를 받고 있어요

Caused by: groovy.lang.MissingPropertyException: No such property: X for class:... 

사람이 잘못 무슨 일이 일어나고 있는지 말해 줄 수 ?

+0

이 문제에 대한 의견이 있으십니까? – tintin

답변

1

짧은 대답은 아니오입니다. $ X 구문은 queryString 내에서만 작동합니다.

그러나 $ X가 발생하면 모든 JasperReports는 쿼리를 실행하기 전에이를 문자열로 변환합니다. 따라서 $X{IN, country,country_param}country IN (country1, country2, ...)

이됩니다. 문제점을 해결하려면 Java에서 문자열을 직접 생성하여 보고서로 변수로 전달하십시오. 이런 식으로 뭔가 :

if(countryList == null){ 
    countryList = defaultCountryList; 
} 

StringBuilder whereParam = new StringBuilder(); 
whereParam.append(country); 
whereParam.append("IN ("); 
for(String s : countryList){ 
    whereParam.append("\""+s+"\""); 
} 
whereParam.append(")"); 

reportParameters.setParameter("where_param", whereParam.toString()); 

그런 다음 $P! 구문을 사용하여 쿼리에 문자열을 배치 할 수 있습니다. 즉 다음 $P 구문과 달리

<queryString> 
<![CDATA[SELECT user_id FROM user_profile WHERE $P!{where_param}]]> 
</queryString> 

$P! 훨씬 $ X가 무엇을하고 있는지와 같은 쿼리를 실행하기 전에 간단한 문자열 교체를 수행합니다.

+0

그게 내가 찾고 있던 해결책! 감사 :-) – tintin

관련 문제