Fórumok

Query custom su JournalArticle usando DynamicQuery

thumbnail
Michele Da Meda, módosítva 9 év-val korábban

Query custom su JournalArticle usando DynamicQuery

New Member Bejegyzések: 9 Csatlakozás dátuma: 2012.09.06. Legújabb bejegyzések
Ciao a tutti, ho realizzato una portlet custom che mostra una lista di WebContent (contenuti che afferiscono ad una mia struttura dati custom).
Tramite tale portlet è anche possibile filtrare i contenuti per titolo e per data di pubblicazione (per capirci il classico intervallo PubblicatoDa , PubblicatoA).
La DynamicQuery da me implementata funziona correttamente, ma non per il campo data (ho usato il campo displayDate dell'entità JournalArticle).

Riporto il pezzo di codice:

DynamicQuery query = DynamicQueryFactoryUtil.forClass(JournalArticle.class, PortalClassLoaderUtil.getClassLoader())
.add(PropertyFactoryUtil.forName(Field.GROUP_ID).eq(new Long(groupId).longValue()))
.add(PropertyFactoryUtil.forName(Field.STATUS).eq(new Integer(status).intValue()))
.add(PropertyFactoryUtil.forName("structureId").eq(myStructureKey));

if (dataDa != null){
query.add(PropertyFactoryUtil.forName("displayDate").gt(dataDa));
}
if (dataA != null){
query.add(PropertyFactoryUtil.forName("displayDate").lt(dataA));
}

if (StringUtils.isNotBlank(title)){
query.add(PropertyFactoryUtil.forName(Field.TITLE).eq(title));
}

query.addOrder(orderAscending?OrderFactoryUtil.asc(Field.CREATE_DATE) : OrderFactoryUtil.desc(Field.CREATE_DATE));

query.setLimit(start, end);


Qualcuno ha mai avuto modo di filtrare per data ?
Esiste un altro approccio che posso utilizzare ? (da notare la necessità di realizzare una portlet custom che filtri anche per campi custom definiti sulla mia struttura).

Grazie
thumbnail
Marco Rosetti, módosítva 9 év-val korábban

RE: Query custom su JournalArticle usando DynamicQuery

Junior Member Bejegyzések: 68 Csatlakozás dátuma: 2013.03.06. Legújabb bejegyzések
Ciao,
non sono un esperto in materia ma hai provato a gestire la cosa tramite Faceted Search?
Mi pare siano abbastanza potenti e modulabili anche se (purtroppo) non ho mai avuto il tempo per studiarle a dovere.

-MR
thumbnail
Daniele Baggio, módosítva 9 év-val korábban

RE: Query custom su JournalArticle usando DynamicQuery

Expert Bejegyzések: 336 Csatlakozás dátuma: 2008.12.05. Legújabb bejegyzések
Perchè dici che il filtro per data non funziona correttamente? Servono dettagli.

p.s. Faceted Search è fuori tema in questo caso. La ricerca di liferay usa l'indice e non una dynamic query.
thumbnail
Michele Da Meda, módosítva 9 év-val korábban

RE: Query custom su JournalArticle usando DynamicQuery (Válasz)

New Member Bejegyzések: 9 Csatlakozás dátuma: 2012.09.06. Legújabb bejegyzések
Daniele Baggio:
Perchè dici che il filtro per data non funziona correttamente? Servono dettagli.

p.s. Faceted Search è fuori tema in questo caso. La ricerca di liferay usa l'indice e non una dynamic query.



Ciao Daniele, in effetti hai ragione, in questi giorni ho poi trovato la soluzione usando l'Indexer, soluzione che condivido ovviamente.
Ad ogni modo non ho ancora capito perchè usando le DynamicQuery e, nello specifico, lo snippet di codice postato, non si riesca a filtrare
per data di pubblicazione, è come se non la prendesse in considerazione.

Ecco poi come ho risolto:

Sort[] sorts = new Sort[1];
sorts[0] = new Sort(Field.PUBLISH_DATE, false);
searchContext.setSorts(sorts);

BooleanQuery booleanQuery = BooleanQueryFactoryUtil.create(searchContext);

booleanQuery.addRequiredTerm( Field.ENTRY_CLASS_NAME, JournalArticle.class.getName() );
booleanQuery.addRequiredTerm( "ddmStructureKey", newsStructureKey );

booleanQuery.addRequiredTerm( "defaultLanguageId", locale.toString() );

BooleanClause booleanClause = BooleanClauseFactoryUtil.create(
searchContext, booleanQuery,
BooleanClauseOccur.MUST.getName());

// filtro per data
BooleanQuery booleanQueryDate = BooleanQueryFactoryUtil.create(searchContext);
Format dateFormat = FastDateFormatFactoryUtil
.getSimpleDateFormat(PropsUtil
.get(PropsKeys.INDEX_DATE_FORMAT_PATTERN));

Long d3 = 19700101000000L;
if (Validator.isNotNull(dataDa)) {
d3 = Long.valueOf(dateFormat.format(dataDa)).longValue();
}
Long d4 = 20990101000000L;
if (Validator.isNotNull(dataA)) {
d4 = Long.valueOf(dateFormat.format(dataA)).longValue();
}
booleanQueryDate.addRangeTerm(Field.PUBLISH_DATE, d3, d4);
// end

BooleanClause booleanClauseDate = BooleanClauseFactoryUtil.create(
searchContext, booleanQueryDate,
BooleanClauseOccur.MUST.getName());

searchContext.setBooleanClauses(new BooleanClause[] { booleanClauseDate, booleanClause });

Hits hits = indexer.search(searchContext);

List<JournalArticle> articles = new ArrayList<JournalArticle>();

List<Document> documents = hits.toList();
thumbnail
Marco Rosetti, módosítva 9 év-val korábban

RE: Query custom su JournalArticle usando DynamicQuery

Junior Member Bejegyzések: 68 Csatlakozás dátuma: 2013.03.06. Legújabb bejegyzések
Hai provato ad abilitare i log a debug di hibernate per vedere quale query effettivamente esegue? A volte a me ha aiutato
thumbnail
Michele Da Meda, módosítva 9 év-val korábban

RE: Query custom su JournalArticle usando DynamicQuery

New Member Bejegyzések: 9 Csatlakozás dátuma: 2012.09.06. Legújabb bejegyzések
Marco Rosetti:
Hai provato ad abilitare i log a debug di hibernate per vedere quale query effettivamente esegue? A volte a me ha aiutato


Si certo, avevo provato, ma mi sembrava che la query fosse corretta.
Ad ogni modo ho risolto con l'indexer..