主题:SqlManager中的 _root 疑惑

zhangyq 2017年01月11日 49

类似以下代码:

public <T> List<T> select(Object paras, Class<T> mapping, RowMapper<T> mapper, long start, long end) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("_root", paras);// _root 在什么时候解析的呢?
		return this.select(map, mapping, mapper, start, end);
	}





public int update(Object obj) {
		Map<String, Object> paras = new HashMap<String, Object>();
		paras.put("_root", obj);// _root 在什么时候解析的呢?
		return this.update(paras);
	}
protected SQLResult run(Map<String, Object> paras, String parentId) {
		GroupTemplate gt = sm.beetl.getGroupTemplate();
		Template t = null;
		if(parentId!=null){
			t = gt.getTemplate(sqlSource.getId(), parentId);
		}else{
			t = gt.getTemplate(sqlSource.getId());
		}
		
		List<Object> jdbcPara = new LinkedList<Object>();
		if (paras != null) {//  上述代码进行遍历绑定到 Template 上
			for (Entry<String, Object> entry : paras.entrySet()) {  
				t.binding(entry.getKey(), entry.getValue());
			}
		}

		t.binding("_paras", jdbcPara);
		t.binding("_manager", this.sm);
		t.binding("_id", id);

		String jdbcSql = t.render();
		SQLResult result = new SQLResult();
		result.jdbcSql = jdbcSql;
		result.jdbcPara = jdbcPara;
		result.mapingEntrys= (List<MappingEntity>)t.getCtx().getGlobal("_mapping");
		return result;
	}

没有找到对 _root 变量进行解析的代码、麻烦请指教。

闲大赋 2017年01月11日

是交给 SQLVarRef  来处理,他跟beetl自带的VarRef 区别在于,如果没有找到变量,会去找_root 变量,并获取其同名的属性,如sql模板里对name引用,


如果你调用beetlsql并没有传入name变量,而是传入user对象作为_root, sql模板仍然能通过SQLVarRef  获取到user.name 

zhangyq 2017年01月11日

beetlsql.png