@Override
    protected List<PersonAttributes> parseAttributeMapFromResults(final List<Map<String, Object>> queryResults, final String queryUserName) {
        val peopleAttributesBuilder = new HashMap<String, Map<String, List<Object>>>();
        val userNameAttribute = getConfiguredUserNameAttribute();

        for (val queryResult : queryResults) {
            val userName = getUserName(queryUserName, queryResult, userNameAttribute);
            val attributes = peopleAttributesBuilder.computeIfAbsent(userName, __ -> new LinkedHashMap<>());
            for (val columnMapping : nameValueColumnMappings.entrySet()) {
                val keyColumn = columnMapping.getKey();
                val attrNameObj = queryResult.get(keyColumn);
                LOGGER.debug("Collecting attribute name=[{}] from column=[{}]", attrNameObj, keyColumn);
                if (attrNameObj == null && !queryResult.containsKey(keyColumn)) {
                    throw new IllegalArgumentException("No attribute key column named " + keyColumn + " exists in result set");
                }
                val attrName = String.valueOf(attrNameObj);

                val valueColumns = columnMapping.getValue();
                val attrValues = new ArrayList<>(valueColumns.size());
                for (val valueColumn : valueColumns) {
                    val attrValue = queryResult.get(valueColumn);
                    LOGGER.debug("Collecting attribute value=[{}] from column=[{}]", attrValue, valueColumn);
                    if (attrValue == null && !queryResult.containsKey(valueColumn)) {
                        throw new IllegalArgumentException("No attribute value column named " + valueColumn + " exists in result set");
                    }
                    attrValues.add(attrValue);
                }
                addResult(attributes, attrName, attrValues);
            }
        }

        val people = new ArrayList<PersonAttributes>(peopleAttributesBuilder.size());
        for (val mappedAttributesEntry : peopleAttributesBuilder.entrySet()) {
            val userName = mappedAttributesEntry.getKey();
            val attributes = mappedAttributesEntry.getValue();
            val person = new SimplePersonAttributes(userName, attributes);
            LOGGER.debug("Collecting person=[{}]", person);
            people.add(person);
        }
        return people;
    }
{@link Map} of columns from a name column to value columns.
Keys are Strings, Values are Strings or Set of Strings.
support/cas-server-support-jdbc-authentication/src/main/java/org/apereo/cas/jdbc/MultiRowJdbcPersonAttributeDao.java