NutzCN Logo
问答 关于结果列表中数据字典展示问题
发布于 2796天前 作者 Memory 2730 次浏览 复制 上一个帖子 下一个帖子
标签: nutzwk

问题描述:
很多时候我在表中存储的数据都是数据字典的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;
    }
7 回复

查n次数据字典的表,所以慢?

另外,dao.getEntity().getFields()可以拿到全部映射字段,里面有eject方法,可以拿到属性值,并不需要你这样反射n次

每一条数据都要查一遍 sys_dict表 不慢吗?

service类写个公共方法即可,有条件的话可以写到redis缓存里(并实现缓存更新机制)

夸张点如果一张表里有5个数据字典表字段,那么一条数据就需要查5次 sys_dict表 同意 一次去10条 那么就是50次 。。。

哦~缓存倒是一个解决方案

所以字典应该默认写在缓存里

添加回复
请先登陆
回到顶部