Liferay 用动态查询表示复杂的子选择

Liferay 用动态查询表示复杂的子选择,liferay,dynamicquery,Liferay,Dynamicquery,如何在ServiceImpl类中使用等效的Liferay DynamicQuery表达式复制此SQL(子选择): SELECT * FROM journalarticle WHERE (urlTitle,version) IN ( SELECT urlTitle,MAX(version) FROM journalarticle WHERE structureId = 'structure-id' AND companyId = 10150 AND groupId = 10170 G

如何在ServiceImpl类中使用等效的Liferay DynamicQuery表达式复制此SQL(子选择):

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

因为我不能写太长的注释,所以我将代码粘贴到这里,这将得到您想要的结果,我还没有编译或运行它

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
        }
DynamicQuery DynamicQuery=DynamicQueryFactoryUtil.forClass(journalaarticle.class);
dynamicQuery.addOrder(OrderFactoryUtil.desc(“createDate”);
动态查询。设置限制(0,4);
DynamicQuery子查询=DynamicQueryFactoryUtil.forClass(journalaarticle.class);
setProjection(ProjectionFactoryUtil.projectionList().add(ProjectionFactoryUtil.property(“_id”)).add(ProjectionFactoryUtil.max(“version”));
add(PropertyFactoryUtil.forName(“structureId”).eq(“structureId”);
subQuery.add(PropertyFactoryUtil.forName(“companyId”).eq(“10150”);
add(PropertyFactoryUtil.forName(“groupId”).eq(“10170”);
列表ID=新的ArrayList();
试一试{
List List=JournalArticleLocalServiceUtil.dynamicQuery(子查询);
对于(对象[]对象:列表){
//第0个字段将是_id
添加((长)对象[0]);
}
}捕获(系统异常e){
//TODO自动生成的捕捉块
}
在(ids.toArray())中添加(PropertyFactoryUtil.forName(“_id”));
试一试{
List journalArticles=JournalArticleLocalServiceUtil.dynamicQuery(dynamicQuery);
}捕获(系统异常e){
//TODO自动生成的捕捉块
}

我希望这可能对您有用。

使用DynamicQuery似乎没有直接的方法来表达如此复杂的子选择,但您可以做一些修改,如果它适合您的话。我忘了提到这是我以前所做的。但是,它使用一个子查询,其中包含对数据库进行额外调用的逻辑。我希望有一种方法可以写出一个最佳表达式。