问题描述:
很多时候我在表中存储的数据都是数据字典的code值,而前台列表展示的时候则需name值,所以我获取列表数据后很多时候我需要通过code值,去数据字典表取name值。但是问题来了,结果表与数据字典表 他不是 一对一,所有很多时候取的比较痛苦。因此严重影响了查询效率问题。
请问有什么好的解决方案不?
附上本人改装的data方法
/**
* DataTable Page
* 此方法主要是针对类中有字典数据的字段进行name值替换
* @param length 页大小
* @param start start
* @param draw draw
* @param orders 排序
* @param columns 字段
* @param cnd 查询条件
* @param linkName 关联查询
* @param subCnd 关联查询条件
* @param keys 需要数据字典中 key-name值替换的map列表
* @return
*/
public NutMap dataCode(int length, int start, int draw, List<DataTableOrder> orders, List<DataTableColumn> columns,
Cnd cnd, String linkName, Cnd subCnd,Map<String,String> keys) {
NutMap re = new NutMap();
if (orders != null && orders.size() > 0) {
for (DataTableOrder order : orders) {
DataTableColumn col = columns.get(order.getColumn());
cnd.orderBy(Sqls.escapeSqlFieldValue(col.getData()).toString(), order.getDir());
}
}
Pager pager = new OffsetPager(start, length);
re.put("recordsFiltered", this.dao().count(this.getEntityClass(), cnd));
List<T> list = this.dao().query(this.getEntityClass(), cnd, pager);
if (!Strings.isBlank(linkName)) {
if (subCnd != null)
this.dao().fetchLinks(list, linkName, subCnd);
else
this.dao().fetchLinks(list, linkName);
}
for(int i=0;i<list.size();i++){
try {
T entity = list.get(i);
// 获取实体类的所有属性,返回Field数组
Field[] fields = entity.getClass().getDeclaredFields();
// 遍历所有属性
for(Field field:fields){
// 获取属性的名字
String name = field.getName();
// 将属性的首字符大写,方便构造get,set方法
if(keys.containsKey(name)){
String methodName = name.substring(0, 1).toUpperCase() + name.substring(1);
String type = field.getGenericType().toString(); // 获取属性的类型
if (type.equals("class java.lang.String")) { // 如果type是类类型,则前面包含"class ",后面跟类名
Method method = entity.getClass().getMethod("get" + methodName);
String value = (String) method.invoke(entity); // 调用getter方法获取属性值
if (!StringUtil.isEmpty(value)) {
method = entity.getClass().getMethod("set"+methodName,String.class);
Base_code baseCode = this.dao().fetch(Base_code.class,
Cnd.where("parentCode","=",keys.get(name)).and("childCode","=",value));
method.invoke(entity, baseCode == null ? value : baseCode.getChildName());
}
}
}
list.set(i, entity);
}
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (SecurityException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
re.put("data", list);
re.put("draw", draw);
re.put("recordsTotal", length);
return re;
}