留言板

Query custom su JournalArticle usando DynamicQuery

thumbnail
Michele Da Meda,修改在9 年前。

Query custom su JournalArticle usando DynamicQuery

New Member 帖子: 9 加入日期: 12-9-6 最近的帖子
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,修改在9 年前。

RE: Query custom su JournalArticle usando DynamicQuery

Junior Member 帖子: 68 加入日期: 13-3-6 最近的帖子
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,修改在9 年前。

RE: Query custom su JournalArticle usando DynamicQuery

Expert 帖子: 336 加入日期: 08-12-5 最近的帖子
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,修改在9 年前。

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

New Member 帖子: 9 加入日期: 12-9-6 最近的帖子
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,修改在9 年前。

RE: Query custom su JournalArticle usando DynamicQuery

Junior Member 帖子: 68 加入日期: 13-3-6 最近的帖子
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,修改在9 年前。

RE: Query custom su JournalArticle usando DynamicQuery

New Member 帖子: 9 加入日期: 12-9-6 最近的帖子
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..