7

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

  1. 以下是我编写的 sql 查询default.xml我已将查询缩减到最低限度,以便逻辑保持简单。由于它包含一些函数和连接,我们无法使用DynamicQueryAPI):

    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);
    }
    

上面的代码将不起作用,因为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);.

谢谢

4

1 回答 1

8

我从liferay 论坛主题中发现,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);
}

希望这对stackoverflow上的人有所帮助,我还找到了一个关于custom-sql的很好的教程,它也使用了相同的方法。

于 2013-04-09T07:08:23.237 回答