ATG - 一对多映射和列表属性结果

时间:2018-01-08 21:45:05

标签: sql oracle join repository atg

我正在努力做一些我应该很简单......但我有一些问题。

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

由于

1 个答案:

答案 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中找到更多信息。