Контейнеры KeyValue
Контейнеры KeyValueContainer и KeyValueCollectionContainer предназначены для работы с сущностями типа KeyValueEntity. Такая сущность может содержать произвольный набор атрибутов, задаваемый во время работы приложения.
KeyValueContainer и KeyValueCollectionContainer могут быть заданы декларативно в XML-дескрипторе экрана элементами keyValueInstance и keyValueCollection.
XML-описание контейнеров KeyValue должно содержать элемент properties, который задает атрибуты KeyValueEntity (то есть ключи и значения). Порядок вложенных элементов property должен соответствовать порядку колонок в результирующем наборе, возвращаемом запросом. Например, в следующем определении атрибут username получит значение из колонки us.user.username, а атрибут stepsCount из колонки count(us):
<keyValueCollection id="summaryDc">
    <loader id="summaryDl">
        <query>
            <![CDATA[select us.user.username, count(us) from UserStep us
            where us.dueDate < current_date and us.completedDate is null
            group by us.user.username]]>
        </query>
    </loader>
    <properties>
        <property name="username" datatype="string"/>
        <property name="stepsCount" datatype="int"/>
    </properties>
</keyValueCollection>Кроме того, можно настроить контейнеры KeyValue, используя их Java API, который содержит следующие методы:
- 
addProperty()- позволяет определить атрибуты сущности (ключи пар ключ-значение). Данный метод принимает имя атрибута и его тип в виде Datatype или Java-класса. В последнем случае класс должен быть либо сущностью, либо классом, поддерживаемым одним из типов данных (datatypes). Фреймворк использует этот метод при декларативном определении свойств контейнера KeyValue в XML, как описано выше.
- 
setIdName()опциональный метод, позволяющий назначить один из атрибутов идентификатором сущности. Это означает, что экземплярыKeyValueEntity, содержащиеся в данном контейнере, будут иметь идентификаторы, получаемые из данного атрибута. В противном случае экземплярыKeyValueEntityполучают случайно сгенерированные UUIDs.
- 
getEntityMetaClass()возвращает динамическую реализацию интерфейса MetaClass, которая представляет текущую схему экземпляровKeyValueEntity, заданную вызовами методаaddProperty().
| Следующие онлайн-примеры демонстрируют KeyValue контейнеры в действии: |