1. 程式人生 > >通過列舉類值獲得列舉類例項

通過列舉類值獲得列舉類例項

需求: 判斷同一監控點下監控點名稱是否已存在
前端頁面
在這裡插入圖片描述
資料庫
(monitor_type:監控點型別;TeleMeasurement:遙測;TeleQuantity:遙信)
在這裡插入圖片描述
實體類:

    @Enumerated(EnumType.STRING)
    @Column(name = "monitor_type", length = 30)
    private MonitorType monitorType;//監控點型別

列舉型別定義如下:

/**
 1. 監控點型別
 */
public enum MonitorType {
	TeleMeasurement("遙測"),TeleQuantity("遙信");
    private String name;

    MonitorType(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
   

難點: 監控點型別欄位(monitor_type)在實體類中是以列舉型別來儲存的
分析: 從選項框選擇後從資料庫查詢選中的監控點型別,由於該欄位在實體類中是以列舉型別儲存,因此從前端獲取到選項框的值也就是列舉類值後需通過該列舉類值去獲得它的描述,然後再去資料庫中查詢。

解決步驟:
1. 獲取選項框選中的值
jsp頁面程式碼:

<div class="ftitle">監控點資訊</div>
        <form id="fm" method="post" novalidate>
         	<div class="fitem">
                <label>監控點型別:</label>
			 <select id="monitorType" name="monitorType" class="easyui-combobox" data-options="								
				         editable:false" style="width:150px" required="true"
                       >
                    <option value="TeleMeasurement">遙測</option>
                    <option value="TeleQuantity">遙信</option>
                </select>
            </div>

js獲取選項框值並傳給控制層:

var type = $("#monitorType").combobox('getText');
        $.post( path+'/monitor/monitorExists' , {type:type, name:mName,id:id} , function(r){
            if(r){
                $.messager.alert("提示","此監控點型別下監控點名已經存在.");
                return;
          	  }else{}
          },'json');

2. 控制層獲取監控點型別的值

 //監控點名是否存在
    @RequestMapping(value = { "/monitorExists" }, method = { org.springframework.web.bind.annotation.RequestMethod.POST })
    @ResponseBody
    public boolean keyExists(HttpServletRequest request) {
        String monitorType = request.getParameter("type");
        ...
        Map<String, String> queryMap = new HashMap<String, String>();
   	queryMap.put("monitorType", monitorType);
   	...
        return this.monitorService.monitorExists(queryMap);
    }

3. service層直接呼叫dao層方法(省略)
4. 列舉類中新增方法,該方法通過列舉類值獲得列舉類例項

 */
public enum MonitorType {
	TeleMeasurement("遙測"),TeleQuantity("遙信");
    private String name;

    MonitorType(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }
    
    //通過列舉類值獲得列舉類例項
    public static MonitorType geMonitorType(String name) {
		for(MonitorType type : MonitorType.values()){
			if(type.getName().equals(name)){
				return type;
			}
		}
		return null;
	}

5.dao層查詢資料庫表
通過 geMonitorType將獲取到的列舉值去得到對應的列舉類例項,然後與資料庫表中儲存的資料進行匹配。

@Override
	public boolean monitorExists(Map<String, String> queryMap) {
		 String name=queryMap.get("name");
		...
		 List<Object> param=new ArrayList<Object>();
		 StringBuilder s=new StringBuilder("select count(*) from Monitor m where deleted=0");
		 if (monitorType!=null) {
			s.append("and m.monitorType=?");
			param.add(MonitorType.geMonitorType(monitorType));
		}
		...
		 Integer total=Integer.valueOf(super.executeScalarByParam(s.toString(), param.toArray()).intValue());
		return  total.intValue() > 0;
	}