我正在努力做一些我应该很简单......但我有一些问题。
TABLE PROVINCE:
CODISTPROV NAME SIGPROV
1 MILAN MI
2 ROME RM
3 NAPLES NA
和TABLE COMUNI:
CODISTPROV CODISTCOM DESC_COM
1 1 XX1
1 2 XX2
2 3 YY3
2 4 YY4
3 5 ZZ5
COMUNI中的CODISTPROV是外国的关键。
xml是
<item-descriptor name="comuniWithSiglaProvincia" writable="false" item-cache-timeout="86400000" item-expire-timeout="604800000">
<table name="province" type="primary" id-column-names="codistprov">
<property name="sigla_provincia" data-type="String" column-name="sigprov" display-name-resource="Sigla provincia"/>
</table>
<table name="comuni" type="multi" id-column-names="codistprov,codistcom" multi-column-name="codistcom">
<property name="listaComuni" data-type="list" component-data-type="String" column-name="desc_com" />
</table>
</item-descriptor>
我想实施此查询
SELECT C.DESC_COM,P.SIGPROV
FROM COMUNI C, PROVINCE P
WHERE C.DESC_COM LIKE 'PAR%' AND C.CODISTPROV = P.CODISTPROV;
其中PAR是来自输入的一些字符。 代码:
RepositoryView view = getTopoAnagraficaRepository().getView("comuniWithSiglaProvincia");
Object params[] = new Object[1];
params[0] = comuneInitialCharacters;
QueryBuilder repositoryBuilder = view.getQueryBuilder();
QueryExpression prop = repositoryBuilder.createPropertyQueryExpression(PROPERTY_LISTA_COMUNI);
QueryExpression value = repositoryBuilder.createConstantQueryExpression(new String(comuneInitialCharacters));
Query query = repositoryBuilder.createPatternMatchQuery(prop, value, QueryBuilder.STARTS_WITH);
listRepItem = view.executeQuery(query); // 19 results
if(listRepItem != null){
for (RepositoryItem item : listRepItem) {
System.out.println("PROV=" + item.getPropertyValue("sigla_provincia")); // it prints correct value
if (item.getPropertyValue("listaComuni") != null) // ArrayIndexOutOfBoundException
[...]
查询返回19 listRepItem(它是正确的)但是当我尝试访问子列表时,我在上面的最后一行得到了ArrayIndexOutOfBoundException。
任何提示? 访问作为列表的属性值的正确方法是什么?
例如,对于上面的数据,如果输入的字符是&#39; XX&#39;我应该有结果
XX1 MI
XX2 MI
由于
答案 0 :(得分:1)
所以我相信你想要实现的是Repository
中的以下数据模型,如下所示:
|
|-- Country1
| |
| |------- Province1
| |------- Province2
| |------- Province3
|-- Country2
|
|------- Province4
|------- Province5
|------- Province6
要在存储库定义中实现此目的,您应该使用set
而不是list
。文档说明:
multi-column-name属性可确保维护多值的顺序。 multi-column-name属性指定的列用于数据类型array,map和list的多值属性,不用于集合(无序)。对于映射类型属性,multi-column-name属性指定的列中的值必须是字符串。 对于列表或数组类型属性,这些值应为整数或数字类型,并且必须是顺序的。
要实现这一点,您对Country的存储库定义应如下所示:
<item-descriptor display-name-resource="Country" use-id-for-path="false" content="false" writable="true" default="true" display-property="name" folder="false" cache-mode="simple" id-separator=":" name="country" >
<table shared-table-sequence="1" name="COUNTRY" id-column-name="id" type="primary">
<property readable="true" queryable="true" hidden="false" backing-map-property="false" name="id" column-name="ID" data-type="string" required="true" writable="true"/>
<property readable="true" queryable="true" display-name="Name" cache-mode="inherit" backing-map-property="false" name="name" column-name="DISPLAY_NAME" data-type="string" required="true" writable="true"/>
</table>
<table shared-table-sequence="1" name="COUNTRY_PROVINCE" id-column-names="COUNTRY_ID" type="multi">
<property readable="true" display-name-resource="provinces" data-type="set" component-item-type="province" required="false" writable="true" queryable="true" cache-mode="inherit" backing-map-property="false" name="provinces" column-name="PROVINCE_ID"/>
</table>
</item-descriptor>
省存储库定义看起来像这样:
<item-descriptor display-name-resource="Province" default="false" expert="false" display-property="name" folder="false" id-separator=":" name="province" use-id-for-path="false" content="false" writable="true">
<table shared-table-sequence="1" name="Province" id-column-name="id" type="primary">
<property readable="true" queryable="true" expert="false" hidden="false" cache-mode="inherit" backing-map-property="false" name="id" column-name="ID" data-type="string" required="true" writable="true"/>
<property readable="true" queryable="true" expert="false" hidden="false" display-name="Name" cache-mode="inherit" backing-map-property="false" name="name" column-name="DISPLAY_NAME" data-type="string" required="true" writable="true"/>
</table>
</item-descriptor>
可以在Oracle Commerce Documentation中找到更多信息。