public Map<String, String> queryInfo(String idNo) {
        if(idNo == null || idNo.length() < 1) {
            return null;
        }

        this.identityNo = idNo;
        Map<String, String> result = new HashMap<String, String>();

        String query = buildQueryString();
        String url = buildConnectionString();
        String class_name = "com.mysql.jdbc.Driver";

        Connection conn = getConnection(url, class_name);
        try {
            Statement stat = conn.createStatement();
            ResultSet set = stat.executeQuery(query);

            while(set.next()) {
                Iterator<String> it = register_info_fields.iterator();
                while (it.hasNext()) {
                    String field = it.next();
                    String value = set.getString(field);
                    /**
                     * createTime and updateTime in the table register_info
                     * should be hidden from users.
                     */
                    if(field.endsWith("createTime") || field.endsWith("updateTime")) {
                        continue;
                    }
                    result.put(field, value);
                }
            }

            /**
             * If there are more than one rows in ResultSet, log it
             * as error because result is ambiguous.
             */
            set.last();
            if(set.getRow() > 1) {
                this.errorLogFile.log(LoggingProxy.ERROR, "["
                        + this.identityNo + "]ReviewProxy error. "
                        + "Multiple rows in ResultSet, ambiguous result. "
                        + "First row is covered.");

                return result;
            }

        }catch (SQLException e) {
            this.errorLogFile.log(LoggingProxy.ERROR, "["
                    + this.identityNo + "]ReviewProxy error. " + e.getMessage());

            return null;
        }

        return result;
    }