键值对容器

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

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

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