Fórumok
Query custom su JournalArticle usando DynamicQuery
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
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
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
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
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.
p.s. Faceted Search è fuori tema in questo caso. La ricerca di liferay usa l'indice e non una dynamic query.
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ésekDaniele 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();
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
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ésekMarco 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..