Accesso ai membri di entità collegate

Buongiorno a tutti,
sto sbattendo la testa da un paio di giorni su un problema che dovrebbe essere semplice, ma da solo non ne riesco ad uscire.

Ho il seguente codice sull’evento onInit() di uno screen:

@Subscribe
public void onInit(InitEvent event) {
    Soggetti soggetto = null;

    ScreenOptions options = event.getOptions();
    if (options instanceof MapScreenOptions) {
        // Recupera i parametri
        if (((MapScreenOptions) options).getParams().get("soggetto") != null) {
            soggetto = (Soggetti) ((MapScreenOptions) options).getParams().get("soggetto");
        }
    }

    ValueLoadContext context = ValueLoadContext.create()
            .setQuery(ValueLoadContext.createQuery(
                    "SELECT " +
                            "e.tenantId, " +
                            "e.scadenza_madre, " +
                            "e.data_scadenza, " +
                            "e.pagamenti_tipi, " +
                            "e.documenti, " +
                            "SUM(e.importo-e.importo_pagato_riscosso) " +
                            "FROM simple_Scadenze e " +
                            "LEFT JOIN e.documenti d " +
                            "WHERE d.soggetto =:soggetto OR :soggetto IS NULL " +
                            "GROUP BY " +
                            "e.tenantId, " +
                            "e.scadenza_madre, " +
                            "e.data_scadenza, " +
                            "e.pagamenti_tipi, " +
                            "e.documenti " +
                            "HAVING SUM(e.importo-e.importo_pagato_riscosso)<>0")
                    .setParameter("soggetto", soggetto))
            .addProperty("tenantId")
            .addProperty("scadenza_madre")
            .addProperty("data_scadenza")
            .addProperty("pagamenti_tipi")
            .addProperty("documenti")
            .addProperty("saldo")
            ;

    List<KeyValueEntity> lista = dataManager.loadValues(context);

    lista.forEach(riga -> {

        Scadenze partitaAperta = dataContext.create(Scadenze.class);

        partitaAperta.setScadenza_madre(riga.getValue("scadenza_madre"));
        partitaAperta.setData_scadenza(riga.getValue("data_scadenza"));
        partitaAperta.setDocumenti(riga.getValue("documenti"));
        partitaAperta.setPagamenti_tipi(PagamentiTipi.fromId(riga.getValue("pagamenti_tipi")));
        partitaAperta.setImporto(riga.getValue("saldo"));

        scadenzesDc.getMutableItems().add(partitaAperta);
    });
}

In pratica riempio un CollectionContainer collegato ad una Table per mostrare dei dati.

Queste sono le colonne della Table:

        <columns>
            <column id="tenantId"/>
            <column id="data_scadenza"/>
            <column id="pagamenti_tipi"/>
            <column id="documenti.tipo_documento"/>
            <column id="documenti.data_documento" caption="Data documento"/>
            <column id="documenti.numero_documento" caption="Numero documento"/>
            <column id="documenti.soggetto.denominazione" caption="Denominazione"/>
            <column id="importo" align="RIGHT" caption="Importo"/>
        </columns>

Funziona tutto perfettamente, ad esclusione della colonna della denominazione, che se la includo mi segnala “Unfetched attribute access error”.
In pratica in questo caso non riesco ad arrivare ai membri di “secondo livello”, in altre parti del programma lo faccio normalmente, quindi le relazioni dovrebbero essere corrette.
L’unica cosa “strana” e’ che cerco di accedere ai membri dal risultato di una query di raggruppamento.

Qualcuno sa darmi un’indicazione?

Grazie

Marco

Ciao Marco,

prima di tutto una domanda: perché non usi il dataManager? Se usi questo metodo tramite le view riesci a pilotare quali campi di quali entità correlate mostrare.

Per quanto riguarda il tuo codice: prova ad aggiungere la join con la tabella del soggetto.

Spero ti sia di aiuto.

Ciao

Ciao,
intanto grazie per la risposta.
Non uso il dataManager perchè non gestisce le query di riepilogo, o almeno non sono riusco a farlo funzionare io. Le query con il GROUP BY riesco a farle solo ottenendo una KeyValueEntity. C’e’ il modo di farle anche dal data manager?
Ho provato a mettere in join i soggetti, ma niente da fare.
In pratica la gerarchia e’ Scadenza->Prima nota->Soggetto, il primo livello, cioe’ l’entità della prima nota riesco a vedere regolarmente tutti i membri, mentre il secondo no.
Nel resto del programma riesco a vedere tranquillamente anche tre quattro livelli…
Ci deve essere qualcosa che mi e’ sfugge.
Marco

Ah scusatemi, la gerarchia riferita al codice sopra e’ Scadenza -> Documento -> Soggetto
Marco

Non so se puo’ essere di aiuto nel capire il problema, ma
impostando @ManyToOne(fetch = FetchType.EAGER) invece di LAZY sull’entità Documenti miracolosamente vede tutti i membri dell’entità Soggetti.
Pero’ da quello che ho capito su EAGER e LAZY non e’ proprio la soluzione migliore, in caso di EAGER quando di carica una riga di un’entità documenti carica tutte le volte TUTTE le entità Soggetti non solo quella associata. Ho capito bene?
Marco

Dovrei aver risolto e soprattutto senza EAGER :slight_smile:
In pratica stavo utilizzando la view “_local” che credo sia quella di default, come ho fatto in tutto il programma aggiungendo via via le colonne che mi servono perche’ conosco ancora troppo poco Cuba.
In questo caso e’ bastato creare una nuova view “specializzata” con le colonne che mi servono, usare quella nello screen e tutto funziona. Ovviamente sui soggetti ho rimesso a posto l’annotazione fetch = FetchType.LAZY.

Ciao mselmi,

scusa se non ti ho risposto, ma sono stato molto impegnato. La soluzione che hai trovato è quella corretta ed è quella che ti suggerivo nella risposta: Accesso ai membri di entità collegate

del 18 Gennaio.

Comunque ottimo, continua a studiare Cuba che è una piattaforma davvero fantastica.