键值对容器

KeyValueContainerKeyValueCollectionContainer 是用来处理 key-value 实体 的。这个实体可以包含任意数量在运行时定义的属性。

KeyValueContainerKeyValueCollectionContainer 可以在界面 XML 描述中用 keyValueInstancekeyValueCollection 元素定义。

键值对容器的 XML 定义必须包含 properties 元素,用来定义 KeyValueEntity 的属性(即,key 和 key 的类型)。property 元素的顺序必须与查询返回的列顺序一致。比如,在下面的定义中,customer 属性会从 o.customer 列获取数据,sumsum(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() 来定义的。