键值对容器
KeyValueContainer
和 KeyValueCollectionContainer
是用来处理 key-value 实体 的。这个实体可以包含任意数量在运行时定义的属性。
KeyValueContainer
和 KeyValueCollectionContainer
可以在界面 XML 描述中用 keyValueInstance
和 keyValueCollection
元素定义。
键值对容器的 XML 定义必须包含 properties
元素,用来定义 KeyValueEntity
的属性(即,key 和 key 的类型)。property
元素的顺序必须与查询返回的列顺序一致。比如,在下面的定义中,customer
属性会从 o.customer
列获取数据,sum
从 sum(o.amount)
列获取:
<data readOnly="true">
<keyValueCollection id="ordersDc">
<loader id="ordersDl">
<query>
<![CDATA[select o.customer, sum(o.amount) from uiex1_Order o group by o.customer]]>
</query>
</loader>
<properties>
<property name="customer" class="ui.ex1.entity.Customer"/>
<property name="sum" datatype="decimal"/>
</properties>
</keyValueCollection>
</data>
另外,可以用键值对容器的 Java API 进行配置,包含了下列方法:
-
addProperty()
用于定义实体属性(键值)。这个方法接收属性名称和对应的类型,类型可以是 Datatype 或 Java 类。在使用 Java 类的情况下,这个类要么是实体类,要么是由 Datatype 支持的类。当在 XML 中以声明式的方式定义键值对容器时,框架底层其实使用了这个方法。 -
setIdName()
是一个可选择调用的方法,通过这个方法可以将一个属性定义为实体的 id 属性。也就是说,保存在此容器内的KeyValueEntity
实体将使用指定的属性作为 id。否则,KeyValueEntity
将使用随机生成的 UUID 作为标识符。 -
getEntityMetaClass()
返回 MetaClass 接口的动态实现类,这个类表达了KeyValueEntity
实例的当前结构,实例的结构是通过之前调用addProperty()
来定义的。