[Oracle ADF] Задать программно bind variables типа Array во ViewObject

Пока только 1 раз приходилось делать. Передаю массив строк

Если делать стандартным способом, вроде передать массив, получаю:

javax.faces.el.EvaluationException: oracle.jbo.JboException: Cannot insert/update Array without context information

Но есть решение.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
private ArrayList<String> SelectedElementsInArray = new ArrayList<String>();



public void onSelectManyChoiseChanged(ValueChangeEvent valueChangeEvent) {

    this.SelectedElementsInArray.removeAll(this.SelectedElementsInArray);

    Object[] selectedListElements = (Object[])valueChangeEvent.getNewValue();

    if (selectedListElements != null){
        for (int si=0; si<selectedListElements.length; si++){
            this.SelectedElementsInArray.add(selectedListElements[si].toString());
        }
    }
    System.out.println(Arrays.toString(this.SelectedElementsInArray.toArray()));
}


public void onBunntonRefreshClicked(ActionEvent actionEvent) {

    ViewObject vo = VOUtils.getViewObjectByName(MY_VO_NAME);
    VariableValueManager vm = vo.ensureVariableManager();

    HashMap context = new HashMap();
    context.put(DomainContext.ELEMENT_SQL_NAME, "CHARTABLETYPE");
    context.put(DomainContext.ELEMENT_TYPE, String.class);

    oracle.jbo.domain.Array resArr = new oracle.jbo.domain.Array(this.SelectedElementsInArray.toArray());
    resArr.setContext(null, null, context);

    vm.setVariableValue("my_array_attr", resArr);

    vo.executeQuery();
}


!!! Возможно, что если нужно установить пустой массив, делается это так

resArr = new oracle.jbo.domain.Array(new Object[] { “none-none” });


В SQL запросе (ViewObject) это может выглядеть следующим образом

1
2
3
and something_very_important in
 (select value(t)
     from table(cast(:my_array_attr as CHARTABLETYPE)) t)