Come possiamo recuperare le entità liferay tramite il custom-finder utilizzando SQL personalizzato?Come recuperare l'entità liferay tramite il mirino personalizzato nel portlet del plugin personalizzato?
In seguito è la mia query SQL scritto in
default.xml
( ho tagliato verso il basso la query al minimo in modo che la logica rimane semplice. Dal momento che comprendeva un paio di funzioni e unisce non abbiamo potuto utilizzareDynamicQuery
API):SELECT grp.* FROM Group_ WHERE site = 1 AND active_ = 1 AND type_ <> 3
relativo codice in
MyCustomGroupFinderImpl.java
:Session session = null; try { session = openSession(); // fetches the query string from the default.xml String sql = CustomSQLUtil.get(FIND_ONLY_ACTIVE_SITES); SQLQuery sqlQuery = session.createSQLQuery(sql); sqlQuery.addEntity("Group_", GroupImpl.class); // sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl")); return (List<Group>) QueryUtil.list(sqlQuery, getDialect(), 0, QueryUtil.ALL_POS); } catch (Exception e) { throw new SystemException(e); } finally { closeSession(session); }
Questo codice sopra riportato non funziona poiché la classe GroupImpl
è presente in portal-impl.jar
e questo jar non può essere utilizzato nel portlet personalizzato.
Ho anche provato ad utilizzare sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
Ma questo codice precedente genera un'eccezione:
com.liferay.portal.kernel.exception.SystemException:
com.liferay.portal.kernel.dao.orm.ORMException:
org.hibernate.MappingException:
Unknown entity: com.liferay.portal.model.impl.GroupImpl
Ma lo stesso codice funziona per il nostro custom-entità, se scriviamo sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class);
.
Grazie
la chiamata closeSession sul blocco finally chiude quella sessione? Ho guardato il codice di liferay e ho scoperto che utilizza la sessionFactory del finder per chiudere la sessione, quindi la mia domanda. –
@ user1316487 Penso che in questo caso dovrebbe essere "sessionFactory.closeSession (session)". Grazie per la segnalazione. –