bloggers bloggers

Marco Napolitano
Messaggi: 68
Stelle: 0
Data: 15/11/17
Jader Jed Francia
Messaggi: 50
Stelle: 0
Data: 22/09/17
Ezio Lombardi
Messaggi: 9
Stelle: 0
Data: 23/06/17
Chiara Mambretti
Messaggi: 25
Stelle: 0
Data: 27/02/17
Serena Traversi
Messaggi: 3
Stelle: 0
Data: 21/07/16
Francesco Falanga
Messaggi: 8
Stelle: 0
Data: 14/06/16
Antonio Musarra
Messaggi: 2
Stelle: 0
Data: 18/11/13
Simone Celli Marchi
Messaggi: 6
Stelle: 0
Data: 09/07/13
marcello marangio
Messaggi: 4
Stelle: 0
Data: 05/07/13
Marco Mancini
Messaggi: 1
Stelle: 0
Data: 05/06/13
Indietro

Eseguire SQL custom con Liferay DXP

Mi sono trovato a dover fare una cosa abbastanza banale e fatta già un milione di volte, ossia eseguire query custom su Liferay; c'era però una grossa incognita, dovevo farlo con Liferay DXP.

Per evitare di perdere tempo inutilmente ho deciso di partire dalla documentazione ufficiale di Liferay per capire cosa c'era di diverso nella nuova versione (e se c'era qualcosa di diverso); così ho iniziato a leggere su https://dev.liferay.com/develop/tutorials/-/knowledge_base/7-0/custom-sql e mi sono tranquillizzato perchè era praticamente tutto uguale alla 6.2.

Eh già... Era praticamente tutto uguale perchè di fatto quella pagina era un copia/incolla della versione 6.2; peccato che sulla versione 7 si facesse in maniera leggermente diversa. Quindi ho dovuto perdere tempo inutilmente ma alla fine ho capito e lo racconto anche a voi così che possiate essere operativi in tempi brevi.

Innanzitutto definiamo il file che conterrà le nostre query custom; qui è rimasto tutto uguale ed è sufficiente creare il file src/main/resources/custom-sql/default.xml all'interno del progetto *-service; la struttura del file è la solita, in cui dobbiamo definire tanti elementi <sql> con il loro id (secondo la convenzione nome completo del finder + metodo).

Dopodichè, all'interno del package *.service.persistence.impl andiamo a definire l'implementazione del nostro finder:

public class EntityFinderImpl extends BasePersistenceImpl<Entity> implements EntityFinder {
}

Lanciamo quindi il task Gradle buildService del progetto contenitore affinchè vengano generate tutte le interfacce e le classi necessarie; con un pò di sorpresa anche la definizione della vostra classe cambierà.

A questo punto potete definire il vostro metodo come siete abituati a fare, ad esempio:

private static final String FIND_BY_QUALCOSA = EntityFinder.class.getName() + "nome metodo";

public List<Entity> findByQualcosa(long groupId, ..., int start, int end, OrderByComparator<Entity> comparator) {
    Session session = null;

    try {
        session = openSession();

        String sql = CustomSQLUtil.get(this.getClass(), FIND_BY_QUALCOSA);
        sql = CustomSQLUtil.replaceOrderBy(sql, comparator);

        SQLQuery q = session.createSQLQuery(sql);
        q.addEntity(EntityImpl.TABLE_NAME, EntityImpl.class);

        QueryPos qPos = QueryPos.getInstance(q);
        qPos.add(groupId);
        qPos.add(...);

        return (List<Entity>) QueryUtil.list(q, getDialect(), start, end);
    }
    finally {
        closeSession(session);
    }
}

E qui iniziano le cose divertenti!

Innanzitutto noterete che adesso la classe OrderByComparator utilizza i Generics per specificare l'entità relativa; dopodichè il metodo non solleva eccezioni! Già perchè su Liferay 7 la classe SystemException ora estende RuntimeException e quindi non è più obbligatorio dichiararla (volendo non serve nemmeno quindi fare il catch); discorso diverso invece per PortalException che deve sempre essere gestita, se serve.

Poi c'è la classe CustomSQLUtil... Si usa come prima ma per recuperare la query SQL serve un parametro in più, che è la classe in cui ci si trova. Ma le sorprese non finiscono qui, perchè la classe CustomSQLUtil non è più automaticamente presente tra le dipendenze del progetto; la dobbiamo aggiungere a mano, ma prima dobbiamo capire come si chiami questa dipendenza...

Ma vi risparmio la fatica! Aprite il file build.gradle del progetto *-service ed aggiungete questa riga tra le dipendenze:

compileOnly group: "com.liferay", name: "com.liferay.portal.dao.orm.custom.sql", version: "1.0.6"

Ora fate un Refresh Gradle Project del progetto (pulsante destro, menu Gradle) in modo da scaricare la dipendenza; dopodichè rieseguite il task Gradle buildService ed al solito aggiungete l'invocazione del finder all'interno della *LocalServiceImpl.

Buon divertimento!

Commenti
Nessun commento. Vuoi essere il primo.