4.5.3.3. Value Datasources
Value datasources позволяют выполнять запросы, возвращающие скалярные и агрегатные значения. Например, следующим запросом можно загрузить некоторую агрегатную статистику по покупателям:
select o.customer, sum(o.amount) from demo$Order o group by o.customer
Value datasources работают с сущностями особого типа: KeyValueEntity
. Такая сущность может содержать произвольный набор атрибутов, задаваемый во время работы приложения. Так, в примере выше, экземпляры KeyValueEntity
будут содержать два атрибута: первый типа Customer
, второй типа BigDecimal
.
Реализации value datasources унаследованы от других широко используемых классов источников данных и дополнительно реализуют специфический интерфейс ValueDatasource
. На диаграмме ниже изображены реализации value datasources и их базовые классы:
Интерфейс ValueDatasource
содержит следующие методы:
-
addProperty()
- так как источник данных может содержать произвольный набор атрибутов, с помощью данного метода необходимо указать, какие атрибуты ожидаются. Он принимает имя атрибута и его тип в виде Datatype или Java-класса. В последнем случае класс должен быть либо сущностью, либо классом, поддерживаемым одним из типов данных (datatypes). -
setIdName()
- опциональный метод, позволяющий назначить один из атрибутов идентификатором сущности. Это означает, что экземплярыKeyValueEntity
, содержащиеся в данном источнике данных будут иметь идентификаторы, получаемые из данного атрибута. В противном случае, экземплярыKeyValueEntity
получают случайно сгенерированные UUIDs. -
getMetaClass()
возвращает динамическую реализацию интерфейсаMetaClass
, которая представляет текущую схему экземпляровKeyValueEntity
, заданную вызовами методаaddProperty()
.
Value datasources могут быть заданы декларативно в XML-дескрипторе. Существует три XML-элемента, соответствующих классам реализации:
-
valueCollectionDatasource
-
valueGroupDatasource
-
valueHierarchicalDatasource
XML описание value datasource должно содержать элемент properties
, который задает атрибуты KeyValueEntity
, содержащихся в источнике данных (см. метод addProperty()
выше). Порядок элементов property
должен соответствовать порядку колонок в результирующем наборе, возвращаемом запросом. Например, в следующем определении атрибут customer
получит значение из колонки o.customer
, а атрибут sum
из колонки sum(o.amount)
:
<dsContext>
<valueCollectionDatasource id="salesDs">
<query>
<![CDATA[select o.customer, sum(o.amount) from demo$Order o group by o.customer]]>
</query>
<properties>
<property class="com.company.demo.entity.Customer" name="customer"/>
<property datatype="decimal" name="sum"/>
</properties>
</valueCollectionDatasource>
</dsContext>
Value datasources предназначены только для чтения данных, так как сущность KeyValueEntity
является неперсистентной и не может быть сохранена стандартным механизмом работы с БД.