掲示板

Query custom su JournalArticle usando DynamicQuery

thumbnail
9年前 に Michele Da Meda によって更新されました。

Query custom su JournalArticle usando DynamicQuery

New Member 投稿: 9 参加年月日: 12/09/06 最新の投稿
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
9年前 に Marco Rosetti によって更新されました。

RE: Query custom su JournalArticle usando DynamicQuery

Junior Member 投稿: 68 参加年月日: 13/03/06 最新の投稿
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
9年前 に Daniele Baggio によって更新されました。

RE: Query custom su JournalArticle usando DynamicQuery

Expert 投稿: 336 参加年月日: 08/12/05 最新の投稿
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
9年前 に Michele Da Meda によって更新されました。

RE: Query custom su JournalArticle usando DynamicQuery (回答)

New Member 投稿: 9 参加年月日: 12/09/06 最新の投稿
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
9年前 に Marco Rosetti によって更新されました。

RE: Query custom su JournalArticle usando DynamicQuery

Junior Member 投稿: 68 参加年月日: 13/03/06 最新の投稿
Hai provato ad abilitare i log a debug di hibernate per vedere quale query effettivamente esegue? A volte a me ha aiutato
thumbnail
9年前 に Michele Da Meda によって更新されました。

RE: Query custom su JournalArticle usando DynamicQuery

New Member 投稿: 9 参加年月日: 12/09/06 最新の投稿
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..