Wie können wir liveray-Entitäten über Custom-Finder mit benutzerdefiniertem SQL abrufen?Wie liferey Entity über benutzerdefinierten Finder in benutzerdefinierten Plugin-Portlet abrufen?
Es folgt meine SQL-Abfrage geschrieben in
default.xml
( Ich habe die Abfrage auf das Nötigste abgespeckt, so dass die Logik einfach bleibt. Da es einige Funktionen enthalten und schließt sie uns nichtDynamicQuery
API verwenden könnten):SELECT grp.* FROM Group_ WHERE site = 1 AND active_ = 1 AND type_ <> 3
Relevante Code 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); }
Dieser obige Code funktioniert nicht, da die Klasse GroupImpl
in portal-impl.jar
vorhanden ist und dieses JAR nicht im benutzerdefinierten Portlet verwendet werden kann.
Ich habe auch versucht sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
Aber der obige Code löst Ausnahme mit:
com.liferay.portal.kernel.exception.SystemException:
com.liferay.portal.kernel.dao.orm.ORMException:
org.hibernate.MappingException:
Unknown entity: com.liferay.portal.model.impl.GroupImpl
Aber der gleiche Code funktioniert für unsere custom-Einheit, wenn wir sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class);
schreiben.
Dank
würde das closeSession-Aufruf auf dem endgültigen Block diese Sitzung schließen? Ich schaute auf den Code von liveray und fand heraus, dass er die SessionFactory des Finders verwendet, um die Sitzung zu schließen, daher meine Frage. –
@ user1316487 Ich denke, es sollte 'sessionFactory.closeSession (Sitzung)' in diesem Fall sein. Danke, dass du darauf hingewiesen hast. –