一个数据库设计的问题,关于民族这个字段的

时间:2022-12-11 18:18:16
          设计一个数据库,有民族这个字段,我看有的数据库设计的时候存的是一个编码,比如01代表汉族,02代表蒙古族等等,我是直接把值存了,我想问下村代码有什么好处,因为民族不会改变的,为什么要存一个编码,这样如果用ssh2框架的时候hibernate怎么取啊,这样的字段可能比较多,有10个左右,我存的都是值,我不清楚为什么要存一个编码!有哪位大神可以跟我讲讲这样的好处,怎么更加简单的取出来!

31 个解决方案

#1


大神在哪,呼叫中

#2


另外再维护一个民族的码表,把编号和名字记录下来;用的时候关联查询这个码表,方便后期维护吧,比如新增一个人,民族从这个码表里选择

#3


在数据库设计方面,建议用编码,将来无论排序、查找还是统计数字都优于文本。

#4


我是习惯以code方式存的

具体说不清 但是 感觉应该是这样的

code拿出来 以字典表的方式 得到翻译 然后显示出来 就比如说 名族 code 为01 在字典表中汉族

另一个是绑定方便 例如 中国少数名族 美国名族等。

比如一张表 

dict_code    index   dict_name
     1                              china
     2                               usa
     11              1            han
     12              1            miao
     21              2            Hispanics
     22              2            Cherokee


而code 也就是你说的编码 不是可以和index 做关联吗!?

这样我们一张表可以做很多事情
假如说客户先选中编码 1 也就是中国 那么自动把中国名族都搞出来 之后放到下拉框 让客户去选择
select * from table a where 1=1 and a.dict_code = a.index
你感觉这样不方便吗

#5


上面sql 有问题 
select a.dict_code from table a where 1=1 and a.dict_code = a.index and dict_code = 1;
这样简单速度 效率 很快把中国少数名族都拿出来 而且全部在一张表

#6


所有说你可能走入了一个误区 
一张表 不可能只为了一个字段去做事

所有我们会考虑很多情况 


比如 我现在让你建一张表

中国所有的城市
一个城市所有的区域 
一个区域所有的商圈 

你会怎么去做!?



那么首先 我们要考虑怎么去建表!?

如果是我,因为只能搞一张表 。所以我会这么做,只给你做参考用

table:`dict_master`
colunm:
id
dict_type 
dict_type_desc
dict_code
dict_code_desc
index_code
created_ts
updated_ts

id 这个不用说 了 
dict_type 我是用来区分 城市区域商圈 类型的 以后可以再扩展 
dict_code 就是编号
index_code 做关联用的

那么表好了以后差不多是这个样子的


id     dict_type     dict_type_desc     dict_code      dict_code_desc    index_code    created_ts                updated_ts
1       CITY            城市              SH                上海                       0000-00-00  00:00:00      0000-00-00  00:00:00
2       DISTRICT        区域              PT                普陀            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
3       DISTRICT        区域              JA                静安            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
4       DISTRICT        区域              YP                杨浦            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
5       DISTRICT        区域              HK                虹口            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
6       DISTRICT        区域              PD                浦东            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
7       DISTRICT        区域              BS                宝山            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
8       DISTRICT        区域              ZB                闸北            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
9       CIRCLE          商圈              YPGY              杨浦公园        YP         0000-00-00  00:00:00      0000-00-00  00:00:00
10      CIRCLE          商圈              KJ                控江            YP         0000-00-00  00:00:00      0000-00-00  00:00:00
11      CIRCLE          商圈              AS                鞍山            YP         0000-00-00  00:00:00      0000-00-00  00:00:00
12      CIRCLE          商圈              WJC               五角场          YP         0000-00-00  00:00:00      0000-00-00  00:00:00
13      CIRCLE          商圈   LXGY              鲁迅公园        HK        0000-00-00  00:00:00      0000-00-00  00:00:00
14      CIRCLE          商圈              SCBL              四川北路        HK         0000-00-00  00:00:00      0000-00-00  00:00:00

#7


我认为直接存值比较好,方便一目了然,弄个数字感觉故弄玄虚

#8


如果直接存值,汉族改成了水族,你得用update语句来修改,如果数据量上亿的话需要花费的时间比较长,用数字编号则可只改一个地方就完成这个变动带来的影响。只是举个例子,名族当然肯定不会轻易改动的,还有一点汉字占空间比较大,如果说你的数据量不大的话,可以直接存值,否则就用编号。

#9


这样的东西,一般会存在字典表里
data_code,data_name,type_id

#10


引用 6 楼 liujiaji317liu 的回复:
所有说你可能走入了一个误区 
一张表 不可能只为了一个字段去做事

所有我们会考虑很多情况 


比如 我现在让你建一张表

中国所有的城市
一个城市所有的区域 
一个区域所有的商圈 

你会怎么去做!?



那么首先 我们要考虑怎么去建表!?

如果是我,因为只能搞一张表 。所以我会这么做,只给你做参考用

table:`dict_master`
colunm:
id
dict_type 
dict_type_desc
dict_code
dict_code_desc
index_code
created_ts
updated_ts

id 这个不用说 了 
dict_type 我是用来区分 城市区域商圈 类型的 以后可以再扩展 
dict_code 就是编号
index_code 做关联用的

那么表好了以后差不多是这个样子的


id     dict_type     dict_type_desc     dict_code      dict_code_desc    index_code    created_ts                updated_ts
1       CITY            城市              SH                上海                       0000-00-00  00:00:00      0000-00-00  00:00:00
2       DISTRICT        区域              PT                普陀            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
3       DISTRICT        区域              JA                静安            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
4       DISTRICT        区域              YP                杨浦            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
5       DISTRICT        区域              HK                虹口            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
6       DISTRICT        区域              PD                浦东            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
7       DISTRICT        区域              BS                宝山            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
8       DISTRICT        区域              ZB                闸北            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
9       CIRCLE          商圈              YPGY              杨浦公园        YP         0000-00-00  00:00:00      0000-00-00  00:00:00
10      CIRCLE          商圈              KJ                控江            YP         0000-00-00  00:00:00      0000-00-00  00:00:00
11      CIRCLE          商圈              AS                鞍山            YP         0000-00-00  00:00:00      0000-00-00  00:00:00
12      CIRCLE          商圈              WJC               五角场          YP         0000-00-00  00:00:00      0000-00-00  00:00:00
13      CIRCLE          商圈   LXGY              鲁迅公园        HK        0000-00-00  00:00:00      0000-00-00  00:00:00
14      CIRCLE          商圈              SCBL              四川北路        HK         0000-00-00  00:00:00      0000-00-00  00:00:00
如果以上这种形式 我们就可以好做很多了
List<DISTRICT> dcList = session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'SH'");
  for(DISTRICT dc : dcList) {
System.out.println("区域 : "+dc.dictCodeDesc);
  }

#11


//上海的所有区域拿出来了
  List<DictMaster> dcList = session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'SH'");
  for(DictMaster dc : dcList) {
System.out.println("区域 : "+dc.dictCodeDesc);
  }
// 杨浦所有商圈拿出来了
  List<DictMaster> dcList = session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'YP'");
  for(DictMaster dc : dcList) {
System.out.println("商圈 : "+dc.dictCodeDesc);
  }

#12


public class DictMaster() {
private int id;
private String dictType;
private String dictTypeDesc;
private String dictCode;
private String dictCodeDesc;
private String indexCode;
private Date createdTs;
private Date updatedTs;

public DictMaster() {

}

// generate getters,settes(id,dictType,dictTypeDesc,dictCode,dictCodeDesc,indexCode,createdTs,updatedTs) ....

}




//上海的所有区域拿出来了
  List<DictMaster> districtDictList= session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'SH'");
   request.setAttribute("districtDictList",districtDictList);
    // 杨浦所有商圈拿出来了
  List<DictMaster> circleDictList= session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'YP'");
    request.setAttribute("circleDictList",circleDictList);



#13


引用 5 楼 liujiaji317liu 的回复:
上面sql 有问题 
select a.dict_code from table a where 1=1 and a.dict_code = a.index and dict_code = 1;
这样简单速度 效率 很快把中国少数名族都拿出来 而且全部在一张表

但是这样有个问题啊,假如我取很多数据,那我怎么把编码转化为值啊,这样的字段如果很多,转换的效率不是很低吗?

#14


引用 13 楼 zp8821138 的回复:
Quote: 引用 5 楼 liujiaji317liu 的回复:

上面sql 有问题 
select a.dict_code from table a where 1=1 and a.dict_code = a.index and dict_code = 1;
这样简单速度 效率 很快把中国少数名族都拿出来 而且全部在一张表

但是这样有个问题啊,假如我取很多数据,那我怎么把编码转化为值啊,这样的字段如果很多,转换的效率不是很低吗?


就是我假如有一个person表,有很多字段,都是用这种编码的形式,比如民族用编码 性别01代表男性,02代表女性,工作性质01代表工人,02代表农民,03代表官员,到时候我再前台显示的时候怎么把性别的01转换为男性,工作性质的01转换为工人呢,这样不是要很多表一起查吗,数据如果很多的话 这样多表效率不会很低吗?

#15


一般用代码来被引用,描述本身可能会变更或翻译成多种语言。当然我们也可以把汉语名称本身当代码,以后翻译直接再给另一个英文或繁体描述。代码本身代表着逻辑方面,而名称仅是给“眼睛”看的,名称可能修改或翻译。

我们之所以用多个表,主要是基于关系型数据库中的消除数据重复,相信我们以前考试时都回答过这道题。

如果本身它被使用到的场合很少,那重复的情况也就不是什么大问题,直接用名称也没什么问题。

#16


如果以后做多语言的版本呢。 

#17


用hql语言取

#18


可以弄个码表,把对应的编码和汉字写入码表。

#19


引用 14 楼 zp8821138 的回复:
假如有一个person表,有很多字段,都是用这种编码的形式,比如民族用编码 性别01代表男性,02代表女性,工作性质01代表工人,02代表农民,03代表官员,到时候我再前台显示的时候怎么把性别的01转换为男性,工作性质的01转换为工人呢,这样不是要很多表一起查吗,数据如果很多的话 这样多表效率不会很低吗?



首先 等于2个sql 虽然一句也可以写完 但其实操作是2个 对吧

1.先把你说的找出阿里 在修改:
String sql = "select p from Person p where 1=1 and a.sex = '01' and a.work_type = '01' " ;
List<Person> pList = session.createQuery(hql);
// 如果翻译 这你自己要写个字典表了

比如:

public class Person {
...
private Sex sex;
private WorkType workType;
...

...
public void setWorkType(String workType) {
  this.workType = new WorkType (workType);
}

public void setSex(String sex) {
 this.sex = new Sex(sex);
}

public WorkType getWorkType() {
return this.workType ;
}

public Sex getSex(){
return this.sex;
}

...

}




public class Sex {
  String male = "01";
  String female = "02";
  public sex(String sex){
     if(male.eques(sex)) {
       .....
     }
  }
}


更直接 用枚举

work type 也是如此 第一次搞肯定很麻烦 以后用的话 你说那个方便吗 。
就像页面跳出来code 一样 404 400 500 这种

#20


引用 19 楼 liujiaji317liu 的回复:
Quote: 引用 14 楼 zp8821138 的回复:


假如有一个person表,有很多字段,都是用这种编码的形式,比如民族用编码 性别01代表男性,02代表女性,工作性质01代表工人,02代表农民,03代表官员,到时候我再前台显示的时候怎么把性别的01转换为男性,工作性质的01转换为工人呢,这样不是要很多表一起查吗,数据如果很多的话 这样多表效率不会很低吗?



首先 等于2个sql 虽然一句也可以写完 但其实操作是2个 对吧

1.先把你说的找出阿里 在修改:
String sql = "select p from Person p where 1=1 and a.sex = '01' and a.work_type = '01' " ;
List<Person> pList = session.createQuery(hql);
// 如果翻译 这你自己要写个字典表了

比如:

public class Person {
...
private Sex sex;
private WorkType workType;
...

...
public void setWorkType(String workType) {
  this.workType = new WorkType (workType);
}

public void setSex(String sex) {
 this.sex = new Sex(sex);
}

public WorkType getWorkType() {
return this.workType ;
}

public Sex getSex(){
return this.sex;
}

...

}




public class Sex {
  String male = "01";
  String female = "02";
  public sex(String sex){
     if(male.eques(sex)) {
       .....
     }
  }
}


更直接 用枚举

work type 也是如此 第一次搞肯定很麻烦 以后用的话 你说那个方便吗 。
就像页面跳出来code 一样 404 400 500 这种



这里其实就是一个问题,取的问题,比如按照你上面的表设计,不是要join很多表来去编码对应的值吗,你下面的那种用常量在java中我用过,我就是想知道在数据库中怎么把编码转值啊!

#21


比如我要去1000条人的数据,如果不把数据字典缓存在内存中,这样查询的时候不是效率很低吗,我设置这样编码的字段有十个,那这个hql怎么写啊!

#22


引用 19 楼 liujiaji317liu 的回复:
Quote: 引用 14 楼 zp8821138 的回复:


假如有一个person表,有很多字段,都是用这种编码的形式,比如民族用编码 性别01代表男性,02代表女性,工作性质01代表工人,02代表农民,03代表官员,到时候我再前台显示的时候怎么把性别的01转换为男性,工作性质的01转换为工人呢,这样不是要很多表一起查吗,数据如果很多的话 这样多表效率不会很低吗?



首先 等于2个sql 虽然一句也可以写完 但其实操作是2个 对吧

1.先把你说的找出阿里 在修改:
String sql = "select p from Person p where 1=1 and a.sex = '01' and a.work_type = '01' " ;
List<Person> pList = session.createQuery(hql);
// 如果翻译 这你自己要写个字典表了

比如:

public class Person {
...
private Sex sex;
private WorkType workType;
...

...
public void setWorkType(String workType) {
  this.workType = new WorkType (workType);
}

public void setSex(String sex) {
 this.sex = new Sex(sex);
}

public WorkType getWorkType() {
return this.workType ;
}

public Sex getSex(){
return this.sex;
}

...

}




public class Sex {
  String male = "01";
  String female = "02";
  public sex(String sex){
     if(male.eques(sex)) {
       .....
     }
  }
}


更直接 用枚举

work type 也是如此 第一次搞肯定很麻烦 以后用的话 你说那个方便吗 。
就像页面跳出来code 一样 404 400 500 这种


你这样不是每次查询还要去查字典表啊?

#23


我们也转么写个constent 用来搞 字典表


public class Constant {
        /*
 *SEXTYPE 性别类型
 */
public static enum SEXTYPE {
MALE("01"),   // 男性
FEMALE("11"),         // 女性
         ;
         private SEXTYPE (String type) {}
   }

        /*
 *WORKTYPE 职业类型
 */
public static enum WORKTYPE {
WORKER("01"),   // 工人
FARMER("02"),         // 农民
                OFFICIAL("03"),         // 官员
    ;
    private WORKTYPE (String type) {}
}
}

#24


顶啊 ,这个用数据字典除了灵活,再取的时候怎么更方便的把编码转换为值啊,比如我要显示100条数据,我怎么把编码转换为值,是在服务启动的时候就把数据字典读到内存中,然后把编码和值进行转换,还有个问题是多个属性的字典是放在一张表中,然后形成一个Map<id,map<id,name>>这种数据结构吗?

#25


引用 24 楼 zp8821138 的回复:
顶啊 ,这个用数据字典除了灵活,再取的时候怎么更方便的把编码转换为值啊,比如我要显示100条数据,我怎么把编码转换为值,是在服务启动的时候就把数据字典读到内存中,然后把编码和值进行转换,还有个问题是多个属性的字典是放在一张表中,然后形成一个Map<id,map<id,name>>这种数据结构吗?


1、可以不用什么字典表,可以直接在代码里用if判断,if(x==1){person.setMinZu("汉族")},判断56个名族,提炼成一个方法,传编号进去,返回民族,或者用switch也可以
2、写一个xml文件,存储56个民族和编号,加载服务器的时候读取到一个静态的Map中,然后代码就可以这样判断
person.setMinZu(map.get(x));
xml的方式比较灵活,如果有变更直接修改xml重启服务就可以,第一种还要修改代码重新编译部署

#26


字典表也没关系,项目启动的时候,或者第一次用到的时候,把字典数据load到内存就好了,数据量很小。kv的格式,想用的时候直接拿就ok了,就剩的连表了。
大数据表的话,能用int就不用varchar,索引效率都会有影响的

#27



ID DICT_TYPE DICT_NAME DICT_DIST FATHER_ID PERSON_NAME PERSON_AGE PERSON_SEX WORK_TYPE
3 WORK_TYPE WORK_O 第一大类工作
4 WORK_TYPE WORK_TW 第二大类工作
5 WORK_TYPE WORK_TH 第三大类工作
6 WORK_TYPE WORK_FO 第四大类工作
7 WORK_TYPE WORK_FI 第五大类工作
8 WORK_TYPE WORK_SI 第六大类工作
9 WORK_TYPE WORK_SE 第七大类工作
10 WORK_TYPE WORK_EI 第八大类工作
31 WORK_O DQO 党群组织 3
32 WORK_O QY 企业 3
33 WORK_O SYCP 事业单位负责人 3
34 WORK_O GJJG 国家机关 3
41 WORK_TW ZYJS 专业技术人员 4
51 WORK_TH BSP_YGP 办事人员和有关人员 5
61 WORK_FO SY 商业 6
62 WORK_FO FWP 服务业人员 6
71 WORK_FI NY 农业 7
72 WORK_FI LY 林业 7
73 WORK_FI MY 牧业 7
74 WORK_FI YY 渔业 7
75 WORK_FI SLY 水利业 7
81 WORK_SI SC 生产 8
81 WORK_SI YSSB 运输设备 8
81 WORK_SI CZP_YGP 操作人员及有关人员 8
91 WORK_SE JP 军人 9
101 WORK_EI OTHER 不便分类的其它从业人员 10
……
6100001 FWP DTM 大堂经理 62
3400001 GJJG ZFJG 行政机关 34
……
3.4E+11 ZFJG SFP 司法人员 3400001
P_00000001 PERSON 史建罔 47 1 3.4E+11




这张表能看懂吗  人物表 

#28


一个数据库设计的问题,关于民族这个字段的


看下效果上面的表 很难看

#29


上面的表看明白了 看最后一行数据 

这是一个人的数据

看下最后一列  workType  它显示的也是index 也就是 引用id关联  看下 他的id号是什么


3.4E+11 ZFJG SFP 司法人员 3400001


职业司法官员 明白怎么用吗 如果但说你简单的男女 那么很简单 只要0,1就好 可是职业如此之多 那么我必须要建一个比较系统好管理表结构 结合 字典表 查询 方便快捷 而且好维护

那么再看下代码块 我怎么处理的 我只不过简单的处理  你看下



public class Constant {
public final static class DictMaster {
public static final String CITY = "CITY"; //城市
public static final String WORKTYPE = "WORKTYPE"; // 工作大类
public static final String WORK_O = "WORK_O"; // 第一工作大类
public static final String WORK_O_GJJG ="GJJG"; // 国家机关
public static final String WORK_O_GJJG_ZFJG = "ZFJG"; // *机关
public static final String WORK_O_GJJG_ZFJG_SFP = "SFP"; // 司法人员
public static final String DISTRICT = "DISTRICT"; //行政区
public static final String CIRCLE = "CIRCLE"; //商圈
}
}


public class ConstantController {
// DictMaster is Entity 
// dict_master is table name

/**
 * 缓存人类->职业大类:
 */
public static Map<String,Person> PERSON_WORK_MAP = new HashMap<String,Person>();
// ... 如(public static Map<String,Person> PERSON_CITY_MAP = new HashMap<String,Person>();)

private static void loadPersonMap(List<Person> list) {
for(Person p : list) {
CacheUtil.PERSON_MAP.put(p.getWorkName, p);
}
}


public static List<DictMaster>     
   WORK_NAME_LIST,    // 工作大类列表   
   WORK_O_NAME_LIST,               // 第一工作大类列表

   .....;                    // ...CITY_NAME_LIST

// 终点 这里加载你说的

//加载***工作大类列表
WORK_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORKTYPE);
//加载第一工作大类列表
WORK_O_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O);
//加载国家机关工作列表
WORK_O_GJJG_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O_GJJG);
//加载*机关工作列表
WORK_O_GJJG_ZFJG_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O_GJJG_ZFJG);


// ... CITY_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.CITY);
// 以上的list你能明白吗 再不明白 我没办法讲了 


private static List<DictMaster> loadDictMasterList(EntityManager em, String dictType) {
List<DictMaster> personList = getDictMasterListBy(em,dictType);
loadDictMasterMap(personList);
return personList;
}

   /**
 * 根据dictType获取DictMaster 列表
 */
private static List<DictMaster> getPersonListBy(EntityManager em, String dictType) {
return em.createQuery("SELECT dm FROM DictMaster dm where dm.dictType=:dictType ORDER BY p.id ASC"
, Person.class).setParameter("dictType", dictType).getResultList();
}

private static void loadDictMasterMap(List<DictMaster> list) {
for(DictMaster dm : list) {
CacheUtil.DICT_MASTER_MAP.put(dm.getDictName(), dm);
}
}
}
   


#30


引用 29 楼 liujiaji317liu 的回复:
上面的表看明白了 看最后一行数据 

这是一个人的数据

看下最后一列  workType  它显示的也是index 也就是 引用id关联  看下 他的id号是什么


3.4E+11 ZFJG SFP 司法人员 3400001


职业司法官员 明白怎么用吗 如果但说你简单的男女 那么很简单 只要0,1就好 可是职业如此之多 那么我必须要建一个比较系统好管理表结构 结合 字典表 查询 方便快捷 而且好维护

那么再看下代码块 我怎么处理的 我只不过简单的处理  你看下



public class Constant {
public final static class DictMaster {
public static final String CITY = "CITY"; //城市
public static final String WORKTYPE = "WORKTYPE"; // 工作大类
public static final String WORK_O = "WORK_O"; // 第一工作大类
public static final String WORK_O_GJJG ="GJJG"; // 国家机关
public static final String WORK_O_GJJG_ZFJG = "ZFJG"; // *机关
public static final String WORK_O_GJJG_ZFJG_SFP = "SFP"; // 司法人员
public static final String DISTRICT = "DISTRICT"; //行政区
public static final String CIRCLE = "CIRCLE"; //商圈
}
}


public class ConstantController {
// DictMaster is Entity 
// dict_master is table name

/**
 * 缓存人类->职业大类:
 */
public static Map<String,Person> PERSON_WORK_MAP = new HashMap<String,Person>();
// ... 如(public static Map<String,Person> PERSON_CITY_MAP = new HashMap<String,Person>();)

private static void loadPersonMap(List<Person> list) {
for(Person p : list) {
CacheUtil.PERSON_MAP.put(p.getWorkName, p);
}
}


public static List<DictMaster>     
   WORK_NAME_LIST,    // 工作大类列表   
   WORK_O_NAME_LIST,               // 第一工作大类列表

   .....;                    // ...CITY_NAME_LIST

// 终点 这里加载你说的

//加载***工作大类列表
WORK_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORKTYPE);
//加载第一工作大类列表
WORK_O_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O);
//加载国家机关工作列表
WORK_O_GJJG_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O_GJJG);
//加载*机关工作列表
WORK_O_GJJG_ZFJG_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O_GJJG_ZFJG);


// ... CITY_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.CITY);
// 以上的list你能明白吗 再不明白 我没办法讲了 


private static List<DictMaster> loadDictMasterList(EntityManager em, String dictType) {
List<DictMaster> personList = getDictMasterListBy(em,dictType);
loadDictMasterMap(personList);
return personList;
}

   /**
 * 根据dictType获取DictMaster 列表
 */
private static List<DictMaster> getPersonListBy(EntityManager em, String dictType) {
return em.createQuery("SELECT dm FROM DictMaster dm where dm.dictType=:dictType ORDER BY p.id ASC"
, Person.class).setParameter("dictType", dictType).getResultList();
}

private static void loadDictMasterMap(List<DictMaster> list) {
for(DictMaster dm : list) {
CacheUtil.DICT_MASTER_MAP.put(dm.getDictName(), dm);
}
}
}
   




你这样还是把类型第一次启动存在内存中,然后把数据得到后进行转换是把?

#31


顶上去!!!

#1


大神在哪,呼叫中

#2


另外再维护一个民族的码表,把编号和名字记录下来;用的时候关联查询这个码表,方便后期维护吧,比如新增一个人,民族从这个码表里选择

#3


在数据库设计方面,建议用编码,将来无论排序、查找还是统计数字都优于文本。

#4


我是习惯以code方式存的

具体说不清 但是 感觉应该是这样的

code拿出来 以字典表的方式 得到翻译 然后显示出来 就比如说 名族 code 为01 在字典表中汉族

另一个是绑定方便 例如 中国少数名族 美国名族等。

比如一张表 

dict_code    index   dict_name
     1                              china
     2                               usa
     11              1            han
     12              1            miao
     21              2            Hispanics
     22              2            Cherokee


而code 也就是你说的编码 不是可以和index 做关联吗!?

这样我们一张表可以做很多事情
假如说客户先选中编码 1 也就是中国 那么自动把中国名族都搞出来 之后放到下拉框 让客户去选择
select * from table a where 1=1 and a.dict_code = a.index
你感觉这样不方便吗

#5


上面sql 有问题 
select a.dict_code from table a where 1=1 and a.dict_code = a.index and dict_code = 1;
这样简单速度 效率 很快把中国少数名族都拿出来 而且全部在一张表

#6


所有说你可能走入了一个误区 
一张表 不可能只为了一个字段去做事

所有我们会考虑很多情况 


比如 我现在让你建一张表

中国所有的城市
一个城市所有的区域 
一个区域所有的商圈 

你会怎么去做!?



那么首先 我们要考虑怎么去建表!?

如果是我,因为只能搞一张表 。所以我会这么做,只给你做参考用

table:`dict_master`
colunm:
id
dict_type 
dict_type_desc
dict_code
dict_code_desc
index_code
created_ts
updated_ts

id 这个不用说 了 
dict_type 我是用来区分 城市区域商圈 类型的 以后可以再扩展 
dict_code 就是编号
index_code 做关联用的

那么表好了以后差不多是这个样子的


id     dict_type     dict_type_desc     dict_code      dict_code_desc    index_code    created_ts                updated_ts
1       CITY            城市              SH                上海                       0000-00-00  00:00:00      0000-00-00  00:00:00
2       DISTRICT        区域              PT                普陀            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
3       DISTRICT        区域              JA                静安            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
4       DISTRICT        区域              YP                杨浦            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
5       DISTRICT        区域              HK                虹口            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
6       DISTRICT        区域              PD                浦东            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
7       DISTRICT        区域              BS                宝山            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
8       DISTRICT        区域              ZB                闸北            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
9       CIRCLE          商圈              YPGY              杨浦公园        YP         0000-00-00  00:00:00      0000-00-00  00:00:00
10      CIRCLE          商圈              KJ                控江            YP         0000-00-00  00:00:00      0000-00-00  00:00:00
11      CIRCLE          商圈              AS                鞍山            YP         0000-00-00  00:00:00      0000-00-00  00:00:00
12      CIRCLE          商圈              WJC               五角场          YP         0000-00-00  00:00:00      0000-00-00  00:00:00
13      CIRCLE          商圈   LXGY              鲁迅公园        HK        0000-00-00  00:00:00      0000-00-00  00:00:00
14      CIRCLE          商圈              SCBL              四川北路        HK         0000-00-00  00:00:00      0000-00-00  00:00:00

#7


我认为直接存值比较好,方便一目了然,弄个数字感觉故弄玄虚

#8


如果直接存值,汉族改成了水族,你得用update语句来修改,如果数据量上亿的话需要花费的时间比较长,用数字编号则可只改一个地方就完成这个变动带来的影响。只是举个例子,名族当然肯定不会轻易改动的,还有一点汉字占空间比较大,如果说你的数据量不大的话,可以直接存值,否则就用编号。

#9


这样的东西,一般会存在字典表里
data_code,data_name,type_id

#10


引用 6 楼 liujiaji317liu 的回复:
所有说你可能走入了一个误区 
一张表 不可能只为了一个字段去做事

所有我们会考虑很多情况 


比如 我现在让你建一张表

中国所有的城市
一个城市所有的区域 
一个区域所有的商圈 

你会怎么去做!?



那么首先 我们要考虑怎么去建表!?

如果是我,因为只能搞一张表 。所以我会这么做,只给你做参考用

table:`dict_master`
colunm:
id
dict_type 
dict_type_desc
dict_code
dict_code_desc
index_code
created_ts
updated_ts

id 这个不用说 了 
dict_type 我是用来区分 城市区域商圈 类型的 以后可以再扩展 
dict_code 就是编号
index_code 做关联用的

那么表好了以后差不多是这个样子的


id     dict_type     dict_type_desc     dict_code      dict_code_desc    index_code    created_ts                updated_ts
1       CITY            城市              SH                上海                       0000-00-00  00:00:00      0000-00-00  00:00:00
2       DISTRICT        区域              PT                普陀            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
3       DISTRICT        区域              JA                静安            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
4       DISTRICT        区域              YP                杨浦            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
5       DISTRICT        区域              HK                虹口            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
6       DISTRICT        区域              PD                浦东            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
7       DISTRICT        区域              BS                宝山            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
8       DISTRICT        区域              ZB                闸北            SH         0000-00-00  00:00:00      0000-00-00  00:00:00
9       CIRCLE          商圈              YPGY              杨浦公园        YP         0000-00-00  00:00:00      0000-00-00  00:00:00
10      CIRCLE          商圈              KJ                控江            YP         0000-00-00  00:00:00      0000-00-00  00:00:00
11      CIRCLE          商圈              AS                鞍山            YP         0000-00-00  00:00:00      0000-00-00  00:00:00
12      CIRCLE          商圈              WJC               五角场          YP         0000-00-00  00:00:00      0000-00-00  00:00:00
13      CIRCLE          商圈   LXGY              鲁迅公园        HK        0000-00-00  00:00:00      0000-00-00  00:00:00
14      CIRCLE          商圈              SCBL              四川北路        HK         0000-00-00  00:00:00      0000-00-00  00:00:00
如果以上这种形式 我们就可以好做很多了
List<DISTRICT> dcList = session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'SH'");
  for(DISTRICT dc : dcList) {
System.out.println("区域 : "+dc.dictCodeDesc);
  }

#11


//上海的所有区域拿出来了
  List<DictMaster> dcList = session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'SH'");
  for(DictMaster dc : dcList) {
System.out.println("区域 : "+dc.dictCodeDesc);
  }
// 杨浦所有商圈拿出来了
  List<DictMaster> dcList = session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'YP'");
  for(DictMaster dc : dcList) {
System.out.println("商圈 : "+dc.dictCodeDesc);
  }

#12


public class DictMaster() {
private int id;
private String dictType;
private String dictTypeDesc;
private String dictCode;
private String dictCodeDesc;
private String indexCode;
private Date createdTs;
private Date updatedTs;

public DictMaster() {

}

// generate getters,settes(id,dictType,dictTypeDesc,dictCode,dictCodeDesc,indexCode,createdTs,updatedTs) ....

}




//上海的所有区域拿出来了
  List<DictMaster> districtDictList= session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'SH'");
   request.setAttribute("districtDictList",districtDictList);
    // 杨浦所有商圈拿出来了
  List<DictMaster> circleDictList= session.createSqlQuery("select dm from dict_master dm where 1=1 and dm.index_code = 'YP'");
    request.setAttribute("circleDictList",circleDictList);



#13


引用 5 楼 liujiaji317liu 的回复:
上面sql 有问题 
select a.dict_code from table a where 1=1 and a.dict_code = a.index and dict_code = 1;
这样简单速度 效率 很快把中国少数名族都拿出来 而且全部在一张表

但是这样有个问题啊,假如我取很多数据,那我怎么把编码转化为值啊,这样的字段如果很多,转换的效率不是很低吗?

#14


引用 13 楼 zp8821138 的回复:
Quote: 引用 5 楼 liujiaji317liu 的回复:

上面sql 有问题 
select a.dict_code from table a where 1=1 and a.dict_code = a.index and dict_code = 1;
这样简单速度 效率 很快把中国少数名族都拿出来 而且全部在一张表

但是这样有个问题啊,假如我取很多数据,那我怎么把编码转化为值啊,这样的字段如果很多,转换的效率不是很低吗?


就是我假如有一个person表,有很多字段,都是用这种编码的形式,比如民族用编码 性别01代表男性,02代表女性,工作性质01代表工人,02代表农民,03代表官员,到时候我再前台显示的时候怎么把性别的01转换为男性,工作性质的01转换为工人呢,这样不是要很多表一起查吗,数据如果很多的话 这样多表效率不会很低吗?

#15


一般用代码来被引用,描述本身可能会变更或翻译成多种语言。当然我们也可以把汉语名称本身当代码,以后翻译直接再给另一个英文或繁体描述。代码本身代表着逻辑方面,而名称仅是给“眼睛”看的,名称可能修改或翻译。

我们之所以用多个表,主要是基于关系型数据库中的消除数据重复,相信我们以前考试时都回答过这道题。

如果本身它被使用到的场合很少,那重复的情况也就不是什么大问题,直接用名称也没什么问题。

#16


如果以后做多语言的版本呢。 

#17


用hql语言取

#18


可以弄个码表,把对应的编码和汉字写入码表。

#19


引用 14 楼 zp8821138 的回复:
假如有一个person表,有很多字段,都是用这种编码的形式,比如民族用编码 性别01代表男性,02代表女性,工作性质01代表工人,02代表农民,03代表官员,到时候我再前台显示的时候怎么把性别的01转换为男性,工作性质的01转换为工人呢,这样不是要很多表一起查吗,数据如果很多的话 这样多表效率不会很低吗?



首先 等于2个sql 虽然一句也可以写完 但其实操作是2个 对吧

1.先把你说的找出阿里 在修改:
String sql = "select p from Person p where 1=1 and a.sex = '01' and a.work_type = '01' " ;
List<Person> pList = session.createQuery(hql);
// 如果翻译 这你自己要写个字典表了

比如:

public class Person {
...
private Sex sex;
private WorkType workType;
...

...
public void setWorkType(String workType) {
  this.workType = new WorkType (workType);
}

public void setSex(String sex) {
 this.sex = new Sex(sex);
}

public WorkType getWorkType() {
return this.workType ;
}

public Sex getSex(){
return this.sex;
}

...

}




public class Sex {
  String male = "01";
  String female = "02";
  public sex(String sex){
     if(male.eques(sex)) {
       .....
     }
  }
}


更直接 用枚举

work type 也是如此 第一次搞肯定很麻烦 以后用的话 你说那个方便吗 。
就像页面跳出来code 一样 404 400 500 这种

#20


引用 19 楼 liujiaji317liu 的回复:
Quote: 引用 14 楼 zp8821138 的回复:


假如有一个person表,有很多字段,都是用这种编码的形式,比如民族用编码 性别01代表男性,02代表女性,工作性质01代表工人,02代表农民,03代表官员,到时候我再前台显示的时候怎么把性别的01转换为男性,工作性质的01转换为工人呢,这样不是要很多表一起查吗,数据如果很多的话 这样多表效率不会很低吗?



首先 等于2个sql 虽然一句也可以写完 但其实操作是2个 对吧

1.先把你说的找出阿里 在修改:
String sql = "select p from Person p where 1=1 and a.sex = '01' and a.work_type = '01' " ;
List<Person> pList = session.createQuery(hql);
// 如果翻译 这你自己要写个字典表了

比如:

public class Person {
...
private Sex sex;
private WorkType workType;
...

...
public void setWorkType(String workType) {
  this.workType = new WorkType (workType);
}

public void setSex(String sex) {
 this.sex = new Sex(sex);
}

public WorkType getWorkType() {
return this.workType ;
}

public Sex getSex(){
return this.sex;
}

...

}




public class Sex {
  String male = "01";
  String female = "02";
  public sex(String sex){
     if(male.eques(sex)) {
       .....
     }
  }
}


更直接 用枚举

work type 也是如此 第一次搞肯定很麻烦 以后用的话 你说那个方便吗 。
就像页面跳出来code 一样 404 400 500 这种



这里其实就是一个问题,取的问题,比如按照你上面的表设计,不是要join很多表来去编码对应的值吗,你下面的那种用常量在java中我用过,我就是想知道在数据库中怎么把编码转值啊!

#21


比如我要去1000条人的数据,如果不把数据字典缓存在内存中,这样查询的时候不是效率很低吗,我设置这样编码的字段有十个,那这个hql怎么写啊!

#22


引用 19 楼 liujiaji317liu 的回复:
Quote: 引用 14 楼 zp8821138 的回复:


假如有一个person表,有很多字段,都是用这种编码的形式,比如民族用编码 性别01代表男性,02代表女性,工作性质01代表工人,02代表农民,03代表官员,到时候我再前台显示的时候怎么把性别的01转换为男性,工作性质的01转换为工人呢,这样不是要很多表一起查吗,数据如果很多的话 这样多表效率不会很低吗?



首先 等于2个sql 虽然一句也可以写完 但其实操作是2个 对吧

1.先把你说的找出阿里 在修改:
String sql = "select p from Person p where 1=1 and a.sex = '01' and a.work_type = '01' " ;
List<Person> pList = session.createQuery(hql);
// 如果翻译 这你自己要写个字典表了

比如:

public class Person {
...
private Sex sex;
private WorkType workType;
...

...
public void setWorkType(String workType) {
  this.workType = new WorkType (workType);
}

public void setSex(String sex) {
 this.sex = new Sex(sex);
}

public WorkType getWorkType() {
return this.workType ;
}

public Sex getSex(){
return this.sex;
}

...

}




public class Sex {
  String male = "01";
  String female = "02";
  public sex(String sex){
     if(male.eques(sex)) {
       .....
     }
  }
}


更直接 用枚举

work type 也是如此 第一次搞肯定很麻烦 以后用的话 你说那个方便吗 。
就像页面跳出来code 一样 404 400 500 这种


你这样不是每次查询还要去查字典表啊?

#23


我们也转么写个constent 用来搞 字典表


public class Constant {
        /*
 *SEXTYPE 性别类型
 */
public static enum SEXTYPE {
MALE("01"),   // 男性
FEMALE("11"),         // 女性
         ;
         private SEXTYPE (String type) {}
   }

        /*
 *WORKTYPE 职业类型
 */
public static enum WORKTYPE {
WORKER("01"),   // 工人
FARMER("02"),         // 农民
                OFFICIAL("03"),         // 官员
    ;
    private WORKTYPE (String type) {}
}
}

#24


顶啊 ,这个用数据字典除了灵活,再取的时候怎么更方便的把编码转换为值啊,比如我要显示100条数据,我怎么把编码转换为值,是在服务启动的时候就把数据字典读到内存中,然后把编码和值进行转换,还有个问题是多个属性的字典是放在一张表中,然后形成一个Map<id,map<id,name>>这种数据结构吗?

#25


引用 24 楼 zp8821138 的回复:
顶啊 ,这个用数据字典除了灵活,再取的时候怎么更方便的把编码转换为值啊,比如我要显示100条数据,我怎么把编码转换为值,是在服务启动的时候就把数据字典读到内存中,然后把编码和值进行转换,还有个问题是多个属性的字典是放在一张表中,然后形成一个Map<id,map<id,name>>这种数据结构吗?


1、可以不用什么字典表,可以直接在代码里用if判断,if(x==1){person.setMinZu("汉族")},判断56个名族,提炼成一个方法,传编号进去,返回民族,或者用switch也可以
2、写一个xml文件,存储56个民族和编号,加载服务器的时候读取到一个静态的Map中,然后代码就可以这样判断
person.setMinZu(map.get(x));
xml的方式比较灵活,如果有变更直接修改xml重启服务就可以,第一种还要修改代码重新编译部署

#26


字典表也没关系,项目启动的时候,或者第一次用到的时候,把字典数据load到内存就好了,数据量很小。kv的格式,想用的时候直接拿就ok了,就剩的连表了。
大数据表的话,能用int就不用varchar,索引效率都会有影响的

#27



ID DICT_TYPE DICT_NAME DICT_DIST FATHER_ID PERSON_NAME PERSON_AGE PERSON_SEX WORK_TYPE
3 WORK_TYPE WORK_O 第一大类工作
4 WORK_TYPE WORK_TW 第二大类工作
5 WORK_TYPE WORK_TH 第三大类工作
6 WORK_TYPE WORK_FO 第四大类工作
7 WORK_TYPE WORK_FI 第五大类工作
8 WORK_TYPE WORK_SI 第六大类工作
9 WORK_TYPE WORK_SE 第七大类工作
10 WORK_TYPE WORK_EI 第八大类工作
31 WORK_O DQO 党群组织 3
32 WORK_O QY 企业 3
33 WORK_O SYCP 事业单位负责人 3
34 WORK_O GJJG 国家机关 3
41 WORK_TW ZYJS 专业技术人员 4
51 WORK_TH BSP_YGP 办事人员和有关人员 5
61 WORK_FO SY 商业 6
62 WORK_FO FWP 服务业人员 6
71 WORK_FI NY 农业 7
72 WORK_FI LY 林业 7
73 WORK_FI MY 牧业 7
74 WORK_FI YY 渔业 7
75 WORK_FI SLY 水利业 7
81 WORK_SI SC 生产 8
81 WORK_SI YSSB 运输设备 8
81 WORK_SI CZP_YGP 操作人员及有关人员 8
91 WORK_SE JP 军人 9
101 WORK_EI OTHER 不便分类的其它从业人员 10
……
6100001 FWP DTM 大堂经理 62
3400001 GJJG ZFJG 行政机关 34
……
3.4E+11 ZFJG SFP 司法人员 3400001
P_00000001 PERSON 史建罔 47 1 3.4E+11




这张表能看懂吗  人物表 

#28


一个数据库设计的问题,关于民族这个字段的


看下效果上面的表 很难看

#29


上面的表看明白了 看最后一行数据 

这是一个人的数据

看下最后一列  workType  它显示的也是index 也就是 引用id关联  看下 他的id号是什么


3.4E+11 ZFJG SFP 司法人员 3400001


职业司法官员 明白怎么用吗 如果但说你简单的男女 那么很简单 只要0,1就好 可是职业如此之多 那么我必须要建一个比较系统好管理表结构 结合 字典表 查询 方便快捷 而且好维护

那么再看下代码块 我怎么处理的 我只不过简单的处理  你看下



public class Constant {
public final static class DictMaster {
public static final String CITY = "CITY"; //城市
public static final String WORKTYPE = "WORKTYPE"; // 工作大类
public static final String WORK_O = "WORK_O"; // 第一工作大类
public static final String WORK_O_GJJG ="GJJG"; // 国家机关
public static final String WORK_O_GJJG_ZFJG = "ZFJG"; // *机关
public static final String WORK_O_GJJG_ZFJG_SFP = "SFP"; // 司法人员
public static final String DISTRICT = "DISTRICT"; //行政区
public static final String CIRCLE = "CIRCLE"; //商圈
}
}


public class ConstantController {
// DictMaster is Entity 
// dict_master is table name

/**
 * 缓存人类->职业大类:
 */
public static Map<String,Person> PERSON_WORK_MAP = new HashMap<String,Person>();
// ... 如(public static Map<String,Person> PERSON_CITY_MAP = new HashMap<String,Person>();)

private static void loadPersonMap(List<Person> list) {
for(Person p : list) {
CacheUtil.PERSON_MAP.put(p.getWorkName, p);
}
}


public static List<DictMaster>     
   WORK_NAME_LIST,    // 工作大类列表   
   WORK_O_NAME_LIST,               // 第一工作大类列表

   .....;                    // ...CITY_NAME_LIST

// 终点 这里加载你说的

//加载***工作大类列表
WORK_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORKTYPE);
//加载第一工作大类列表
WORK_O_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O);
//加载国家机关工作列表
WORK_O_GJJG_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O_GJJG);
//加载*机关工作列表
WORK_O_GJJG_ZFJG_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O_GJJG_ZFJG);


// ... CITY_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.CITY);
// 以上的list你能明白吗 再不明白 我没办法讲了 


private static List<DictMaster> loadDictMasterList(EntityManager em, String dictType) {
List<DictMaster> personList = getDictMasterListBy(em,dictType);
loadDictMasterMap(personList);
return personList;
}

   /**
 * 根据dictType获取DictMaster 列表
 */
private static List<DictMaster> getPersonListBy(EntityManager em, String dictType) {
return em.createQuery("SELECT dm FROM DictMaster dm where dm.dictType=:dictType ORDER BY p.id ASC"
, Person.class).setParameter("dictType", dictType).getResultList();
}

private static void loadDictMasterMap(List<DictMaster> list) {
for(DictMaster dm : list) {
CacheUtil.DICT_MASTER_MAP.put(dm.getDictName(), dm);
}
}
}
   


#30


引用 29 楼 liujiaji317liu 的回复:
上面的表看明白了 看最后一行数据 

这是一个人的数据

看下最后一列  workType  它显示的也是index 也就是 引用id关联  看下 他的id号是什么


3.4E+11 ZFJG SFP 司法人员 3400001


职业司法官员 明白怎么用吗 如果但说你简单的男女 那么很简单 只要0,1就好 可是职业如此之多 那么我必须要建一个比较系统好管理表结构 结合 字典表 查询 方便快捷 而且好维护

那么再看下代码块 我怎么处理的 我只不过简单的处理  你看下



public class Constant {
public final static class DictMaster {
public static final String CITY = "CITY"; //城市
public static final String WORKTYPE = "WORKTYPE"; // 工作大类
public static final String WORK_O = "WORK_O"; // 第一工作大类
public static final String WORK_O_GJJG ="GJJG"; // 国家机关
public static final String WORK_O_GJJG_ZFJG = "ZFJG"; // *机关
public static final String WORK_O_GJJG_ZFJG_SFP = "SFP"; // 司法人员
public static final String DISTRICT = "DISTRICT"; //行政区
public static final String CIRCLE = "CIRCLE"; //商圈
}
}


public class ConstantController {
// DictMaster is Entity 
// dict_master is table name

/**
 * 缓存人类->职业大类:
 */
public static Map<String,Person> PERSON_WORK_MAP = new HashMap<String,Person>();
// ... 如(public static Map<String,Person> PERSON_CITY_MAP = new HashMap<String,Person>();)

private static void loadPersonMap(List<Person> list) {
for(Person p : list) {
CacheUtil.PERSON_MAP.put(p.getWorkName, p);
}
}


public static List<DictMaster>     
   WORK_NAME_LIST,    // 工作大类列表   
   WORK_O_NAME_LIST,               // 第一工作大类列表

   .....;                    // ...CITY_NAME_LIST

// 终点 这里加载你说的

//加载***工作大类列表
WORK_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORKTYPE);
//加载第一工作大类列表
WORK_O_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O);
//加载国家机关工作列表
WORK_O_GJJG_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O_GJJG);
//加载*机关工作列表
WORK_O_GJJG_ZFJG_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.WORK_O_GJJG_ZFJG);


// ... CITY_NAME_LIST = loadDictMasterList(em, Constant.DictMaster.CITY);
// 以上的list你能明白吗 再不明白 我没办法讲了 


private static List<DictMaster> loadDictMasterList(EntityManager em, String dictType) {
List<DictMaster> personList = getDictMasterListBy(em,dictType);
loadDictMasterMap(personList);
return personList;
}

   /**
 * 根据dictType获取DictMaster 列表
 */
private static List<DictMaster> getPersonListBy(EntityManager em, String dictType) {
return em.createQuery("SELECT dm FROM DictMaster dm where dm.dictType=:dictType ORDER BY p.id ASC"
, Person.class).setParameter("dictType", dictType).getResultList();
}

private static void loadDictMasterMap(List<DictMaster> list) {
for(DictMaster dm : list) {
CacheUtil.DICT_MASTER_MAP.put(dm.getDictName(), dm);
}
}
}
   




你这样还是把类型第一次启动存在内存中,然后把数据得到后进行转换是把?

#31


顶上去!!!