如何通过自定义插件portlet中的自定义查找程序获取liferay实体?

时间:2013-04-09 07:08:23

标签: sql service liferay liferay-6 builder

我们如何使用自定义SQL通过自定义查找程序获取liferay实体?

  1. 以下是我用default.xml编写的sql查询(我已经将查询减少到最低限度,因此逻辑仍然很简单。因为它包含了一些函数和连接,所以我们无法'使用DynamicQuery API ):

    SELECT
        grp.*
    FROM
        Group_
    WHERE
        site = 1
        AND active_ = 1
        AND type_ <> 3
    
  2. 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);
    }
    
  3. 上面的代码无效,因为GroupImpl中存在portal-impl.jar类,并且此jar不能用于自定义portlet。

    我也尝试使用sqlQuery.addEntity("Group_", PortalClassLoaderUtil.getClassLoader().loadClass("com.liferay.portal.model.impl.GroupImpl"))
    但是上面的代码引发了异常:

    com.liferay.portal.kernel.exception.SystemException:
        com.liferay.portal.kernel.dao.orm.ORMException:
            org.hibernate.MappingException:
                Unknown entity: com.liferay.portal.model.impl.GroupImpl
    

    但是如果我们写sqlQuery.addEntity("MyCustomGroup", MyCustomGroupImpl.class);,那么相同的代码适用于我们的自定义实体。

    由于

1 个答案:

答案 0 :(得分:8)

我从liferay forum thread发现了session = openSession();而不是liferaySessionFactory 我们需要从// fetch liferay's session factory SessionFactory sessionFactory = (SessionFactory) PortalBeanLocatorUtil.locate("liferaySessionFactory"); Session session = null; try { // open session using liferay's session factory session = sessionFactory.openSession(); // fetches the query string from the default.xml String sql = CustomSQLUtil.get(FIND_ONLY_ACTIVE_SITES); SQLQuery sqlQuery = session.createSQLQuery(sql); // use portal class loader, since this is portal entity 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 { sessionFactory.closeSession(session); // edited as per the comment on this answer // closeSession(session); } 获取会话,如下所示:

{{1}}

希望这能帮助有关stackoverflow的人,我也找到了一个关于custom-sql的好tutorial,它也采用了相同的方法。