0

您将如何在 ServiceImpl 类中使用等效的 Liferay DynamicQuery 表达式复制此 SQL ( Sub-select ):

SELECT * FROM journalarticle
WHERE (urlTitle,version) IN
( SELECT 
    urlTitle,MAX(version) 
FROM journalarticle 
WHERE structureId = 'structure-id' AND companyId = 10150 AND groupId = 10170
GROUP BY urlTitle ) 
ORDER BY createDate DESC 
LIMIT 0,4
4

1 回答 1

0

因为我不能写太长的评论,所以我在这里粘贴代码,这会产生你想要的,我没有编译或运行它。

DynamicQuery dynamicQuery=DynamicQueryFactoryUtil.forClass(JournalArticle.class);
        dynamicQuery.addOrder(OrderFactoryUtil.desc("createDate"));
        dynamicQuery.setLimit(0, 4);

        DynamicQuery subQuery=DynamicQueryFactoryUtil.forClass(JournalArticle.class);
        subQuery.setProjection(ProjectionFactoryUtil.projectionList().add(ProjectionFactoryUtil.property("_id")).add(ProjectionFactoryUtil.max("version")));
        subQuery.add(PropertyFactoryUtil.forName("structureId ").eq("structure-id"));
        subQuery.add(PropertyFactoryUtil.forName("companyId").eq("10150"));
        subQuery.add(PropertyFactoryUtil.forName("groupId").eq("10170"));
        List<Long> ids=new ArrayList<Long>();
        try {
            List<Object[]> list= JournalArticleLocalServiceUtil.dynamicQuery(subQuery);

            for(Object[] object:list){
                //0th field would be _id
                ids.add((Long)object[0]);
            }
        } catch (SystemException e) {
            // TODO Auto-generated catch block
        }

        dynamicQuery.add(PropertyFactoryUtil.forName("_id").in(ids.toArray()));

        try {
            List<JournalArticle> journalArticles=JournalArticleLocalServiceUtil.dynamicQuery(dynamicQuery);
        } catch (SystemException e) {
            // TODO Auto-generated catch block
        }

我希望这可能对你有用。

于 2013-06-18T06:27:39.880 回答