键值对容器
KeyValueContainer
和 KeyValueCollectionContainer
是用来处理 key-value 实体 的。这个实体可以包含任意数量在运行时定义的属性。
KeyValueContainer
和 KeyValueCollectionContainer
可以在界面 XML 描述中用 keyValueInstance
和 keyValueCollection
元素定义。
键值对容器的 XML 定义必须包含 properties
元素,用来定义 KeyValueEntity
的属性(即,key 和 key 的类型)。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>
另外,可以用 Java API 配置键值对容器:
-
addProperty()
用于定义实体属性(键值)。这个方法接收属性名称和对应的类型,类型可以是 Datatype 或 Java 类。在使用 Java 类的情况下,这个类要么是实体类,要么是由 Datatype 支持的类。当在 XML 中以声明式的方式定义键值对容器时,框架底层其实使用了这个方法。 -
setIdName()
是一个可选方法,通过这个方法可以将一个属性定义为实体的 id 属性。也就是说,保存在此容器内的KeyValueEntity
实体将使用指定的属性作为 id。否则,KeyValueEntity
将使用随机生成的 UUID 作为标识符。 -
getEntityMetaClass()
返回 MetaClass 接口的动态实现类,这个类表达了KeyValueEntity
实例的当前结构,实例的结构是通过之前调用addProperty()
来定义的。