ho un criterio che restituisce tutti i dati l'applicazione richiede, in sostanza:Hibernate Criteri: entità distinte e quindi limitare
Criteria criteria = session.createCriteria(Client.class);
criteria.createAlias("address", "address");
criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
criteria.setFirstResult(init);
criteria.setMaxResults(max);
List<Client> clients = criteria.list();
Il problema è che il cliente relazione/indirizzo è bidirezionale: il cliente ha un indirizzo e un indirizzo può appartenere a più di un cliente.
Desidero recuperare gli oggetti client "singoli" in base al loro pk, ovviamente, un certo numero di client come vengono visualizzati in una tabella.
Poiché vengono impostati innanzitutto setFirstResult/setMaxResults, ricevo client duplicati entro i limiti già applicati. Dopo (è stato utilizzato il livello applicazione come non gruppo da), l'ibernazione si libera dei client duplicati, quindi finisco con meno client rispetto al massimo specificato in setMaxResults.
Impossibile raggruppare per (gruppo di proiezione) poiché non restituirà tutte le colonne richieste in client/indirizzi, solo il gruppo per cui la query è raggruppata.
(Per riassumere, La mia tabella ha 100 risultati per pagina ma dopo aver scartato i duplicati ho 98 risultati anziché 100 ...) perché il limite: LIMIT 0,100 viene applicato PRIMA dei gruppi di ibernazione quando deve essere eseguito DOPO)
FetchMode.SELECT l'ha corretto per me: le altre modalità non funzionano in questo caso. –
FetchMode.SELECT è eccezionale ... tranne per il fatto che impone un recupero ansioso, per qualche motivo. Vedi https://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/FetchMode.html Non c'è modo di dire in ibernazione semplicemente di fare un "distinto" sul pk dell'entità che viene recuperata ?? Questa sembra la cosa più ovvia e banale da volere e, come al solito, l'ibernazione rende la vita estremamente complicata per noi. – Marc
A proposito, fare questo con HQL è banale quanto sembra. Basta aggiungere la parola "distinta" nella query. Perché questo è così dolorosamente oneroso usando l'API Criteri è oltre me. Possiamo iniziare a utilizzare i database OO? – Marc