mercoledì 18 novembre 2015

HIbernate criteria - mini tutorial

Questo post non vuole essere esaustivo nei confronti dei criteria, vuole essere una mini-guida per chi si approccia per la prima volta a questo strumento.

La creazione di un criteria

Hibernate gestisce autonomamente il criterio di sessione e transazionalita' (quindi effettua suo sponte commit&rollback). Per utilizzare i criteria quindi avete bisogno che il vostro ambiente vi fornisca una sessione (di hibernate). Un Criteria si crea chiedendolo all'istanza della sessione che avete in mano e invocando il metodo "createCriteria" e passandogli come parametro la classe dell'entity sulla quale volete effettuare query.

Il metodo list()

Una volta fatto questo potete iniziare a fare query su quella tabella. Se volete tutti gli elementi potete fermarvi qui ed invocare direttamente il metodo list() del criteria. Questo metodo restituisce una List di Object per cui o fate un cast o la lasciate cosi' com'e'. Questo metodo si invoca quando il criteria (e quindi la query) puo' restituire piu' di un oggetto.

Il metodo uniqueResult()

Se invece siete sicuri che il risultato sara' unico (p.e. una count o state andando per id) allora c.uniqueResult() e' quello che fa per voi. Restituisce un object quindi dovrete fare un cast per ottenere la vostra entity.

Aggiungere condizioni

Se non si potessero aggiungere condizioni i criteria servirebbero a ben poco, no? Ecco che la classe Restrictions viene in nostro aiuto. invocando il metodo add del criteria da voi creato potete passargli una Restriction in maniera statica (quindi Restrictions.qualcosa). Che sara' eq se volete l'uguaglianza, analogamente lt/gt se minore/maggiore stretto e le/ge se <= / >= divertitevi ad esplorare tutte le possibilita' di Restrictions ce ne sono un sacco (in + lista etc).

Projections

Analogamente il metodo setProjections del criteria vi permette di aggiungere una "proiezione" - ovvero di modificare la select. Analogamente alle restrictions tutto quello che vi serve e' nella classe Projections. Per esempio .rowCount() vi restituira' un unico risultato contentente un numero con il totale delle righe per quella tabella .property(String property Name) vi permette di effettuare la select di un'unica colonna e cosi' via

La comodita' dei criteria

Rispetto ad altri strumenti (come la Query di hibernate) il criteria ha di comodo che genera automaticamente la query necessaria ad estrarre i dati e quindi il codice e' molto piu' compatto e leggibile, soprattutto se non sappiamo se i parametri del metodo ci verranno passati tutti. Un semplice if ci permette di aggiungere al criteria la restriction solo se il parametro e' valorizzato (evitando per esempio il doppio if delle query, uno per mettere la condizione e uno per valorizzare il parametro). Inoltre riducendo la quantita' di codice scritte minimizza il rischio di errori. Hibernate (e non solo i criteria) trasforma il tipo di dato su db in quello dell'entity. Quindi se su db c'e' un varchar (ma con un numero dentro) perche' il dba non e' un dba voi potete dichiararlo come Integer/Long/che vi pare e hibernate ve lo trasformera'. Analogamente potete farci una count o una sum. Inoltre usando criteria/hql che vengono convertiti da hibernate nel dialetto del db che si sta usando, rende il codice indipendente dal database, permettendo di cambiare db se necessario, semplicemente aggiornando il file persistence.xml

Non e' tutto oro quello che luccica

Per contro non hai il controllo diretto di quello che il framework sta facendo, a volte gli errori possono non essere significativi (ho avuto di recente un "where condition not found where expected" dovuto ad un (ok erano due!) nome di colonna sbagliato nell'entity - ma me ne sono accorto soltanto quando ho modificato il metodo per far eseguire ad hibernate una query sql e poi trasformare il result set derivante in entity. Inoltre ci sono cose che hibernate non gestisce bene (una per tutte le union). O le select di un substring ('pippo' = substring(x,y) di una certa colonna).

Come gia' detto questo articolo non e' per niente esaustivo, e' un primo approccio (veloce) ai criteria. Quando ho tempo approfondiro'

Alla prossima!

mercoledì 4 novembre 2015

Laika eroe spaziale


Questo lo screenshot di un link che circola su facebook.

Laika e' stato il primo essere vivente ad andare nello spazio. Non era mai stato fatto prima. Non c'erano dati sui quali fare studi, non c'erano campioni. Non c'era niente. Era stato lanciato un satellite (lo Sputnik) ma non era vivo.

Sinceramente mi sembra naturale che sia stata scelta una cavia prima di mandare un essere umano. Forse all'autore dell'articolo no, e avrebbe preferito essere mandato lui (o chiunque consideri un animale piu' importante di un essere umano). Ma checche' ne pensino gli animalisti l'uomo non e' un semplice animale. Nessun animale sa parlare o pensare o esprimere concetti complessi. Magari loro non si sentono superiori, ma lo siamo. Nessun animale progetta e costruisce macchinari complessi, nessun animale accende il fuoco o cucina.

Usare una cavia, per quanto brutto possa essere uccidedere un animale innocente, e' necessario. Serve per vedere se una certa cosa e' fattibile, serve per avere dei dati e dei campioni di studio. Vi propongo un ottimo articolo di Medbunker a riguardo della sperimentazione animale - leggetelo.

L'esplorazione spaziale non serve solo per vantarsi davanti agli altri Paesi (ed effettivamente con lo sputnik e il lunik l'URSS acquisi' effettivamente un bel po' di prestigio), ma tutte le ricerche che servono per mandare l'uomo nello spazio hanno poi ripercussioni sulla vita sulla terra. Servono inoltre ad avere delle conoscenze dirette del cosmo. Servono a farci sentire piccoli


Servono a darci la giusta misura di quello che siamo. Servono a farci capire che la Terra e' un'isola nel cosmo, e quindi checche' ne dicano gli animalisti/ambientalisti l'esplorazione spaziale giova alla loro causa, perche' aiutano le persone a rendersi conto che la Terra e' l'unica che abbiamo e che se la distruggiamo non ci rimane nient'altro.

Quindi Laika e' un martire, avrebbe preferito vivere? Sicuramente. Era innocente? Senza dubbio. Ma il suo sacrificio e' servito per fare un passo avanti. Laika e' morta perche' noi potessimo vivere meglio. Grazie al sacrificio di Laika l'umanita' ha imparato qualcosa di piu' sull'esplorazione spaziale. Orribile ma necessario.

Sinceramente trovo molto piu' "disumano" l'atteggiamento di chi preferisce sacrificare un essere umano ad un animale.

Se volete approfondire: a che serve andare nello spazio di Paolo Attivissimo

Alla prossima!