Liferay 用动态查询表示复杂的子选择
如何在ServiceImpl类中使用等效的Liferay DynamicQuery表达式复制此SQL(子选择):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
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似乎没有直接的方法来表达如此复杂的子选择,但您可以做一些修改,如果它适合您的话。我忘了提到这是我以前所做的。但是,它使用一个子查询,其中包含对数据库进行额外调用的逻辑。我希望有一种方法可以写出一个最佳表达式。