Parcourir la source

为SQL数据集中SQL定义添加表达式嵌入功能,可以在SQL里直接通过${...}嵌入需要的表达式,可以是一个,也可以是多个

master
jacky6024 il y a 7 ans
Parent
révision
617f007a52
  1. 41
      ureport2-core/src/main/java/com/bstek/ureport/definition/dataset/SqlDatasetDefinition.java

41
ureport2-core/src/main/java/com/bstek/ureport/definition/dataset/SqlDatasetDefinition.java

@ -19,6 +19,8 @@ import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;
@ -26,6 +28,7 @@ import org.springframework.jdbc.datasource.SingleConnectionDataSource;
import com.bstek.ureport.build.Context;
import com.bstek.ureport.build.Dataset;
import com.bstek.ureport.definition.datasource.DataType;
import com.bstek.ureport.expression.ExpressionUtils;
import com.bstek.ureport.expression.model.Expression;
import com.bstek.ureport.expression.model.data.ExpressionData;
import com.bstek.ureport.expression.model.data.ObjectExpressionData;
@ -42,20 +45,20 @@ public class SqlDatasetDefinition implements DatasetDefinition {
private List<Parameter> parameters;
private List<Field> fields;
private Expression sqlExpression;
public Dataset buildDataset(Map<String,Object> parameterMap,Connection conn){
String sqlForUse=sql;
Context context=new Context(null,parameterMap);
if(sqlExpression!=null){
Context context=new Context(null,parameterMap);
ExpressionData<?> exprData=sqlExpression.execute(null, null, context);
if(exprData instanceof ObjectExpressionData){
ObjectExpressionData data=(ObjectExpressionData)exprData;
Object obj=data.getData();
if(obj!=null){
String s=obj.toString();
s=s.replaceAll("\\\\", "");
sqlForUse=s;
}
sqlForUse=executeSqlExpr(sqlExpression, context);
}else{
Pattern pattern=Pattern.compile("\\$\\{.*?\\}");
Matcher matcher=pattern.matcher(sqlForUse);
while(matcher.find()){
String substr=matcher.group();
String sqlExpr=substr.substring(2,substr.length()-1);
Expression expr=ExpressionUtils.parseExpression(sqlExpr);
String result=executeSqlExpr(expr, context);
sqlForUse=sqlForUse.replace(substr, result);
}
}
Map<String, Object> pmap = buildParameters(parameterMap);
@ -65,6 +68,22 @@ public class SqlDatasetDefinition implements DatasetDefinition {
return new Dataset(name,list);
}
private String executeSqlExpr(Expression sqlExpr,Context context){
String sqlForUse=null;
ExpressionData<?> exprData=sqlExpr.execute(null, null, context);
if(exprData instanceof ObjectExpressionData){
ObjectExpressionData data=(ObjectExpressionData)exprData;
Object obj=data.getData();
if(obj!=null){
String s=obj.toString();
s=s.replaceAll("\\\\", "");
sqlForUse=s;
}
}
return sqlForUse;
}
private Map<String,Object> buildParameters(Map<String,Object> params){
Map<String,Object> map=new HashMap<String,Object>();
for(Parameter param:parameters){

Chargement…
Annuler
Enregistrer