需要使用Service Builder在Liferay表中找到Max Value

时间:2014-06-09 12:46:24

标签: liferay liferay-service-builder

我使用Service Builder构建了一个Liferay portlet,它有一个表。其中一个字段包含一个名为“ZValue”的双精度值。我需要向我的-LocalServiceImpl.java文件添加一个公共方法,该方法将返回当前在“ZValue”字段中找到的最大值。 我希望有一个类似于DynamicQuery的Liferay类,而不是返回单个值。我知道我可以返回所有记录并自行循环以获得最大值,但我确信有一种更简单的方法来获得最大值。

我在搜索stackoverflow时发现的是:

DynamicQuery query = DynamicQueryFactoryUtil.forClass(classname);
query.setProjection(ProjectionFactoryUtil.max("ZValue"));

但我不明白如何实际返回值,因为DynamicQuery返回列表而不是单个值。

1 个答案:

答案 0 :(得分:0)

在下面的示例中,我们查询JournalArticle表以查找符合特定条件的所有文章,然后只获取每个文章的最新版本(最大值)。

正如Pankaj所说,你需要创建两个动态查询。第一个用于指定您需要返回最大值:

DynamicQuery subQuery = DynamicQueryFactoryUtil.forClass(JournalArticle.class, "articleSub", PortalClassLoaderUtil.getClassLoader())
            .add(PropertyFactoryUtil.forName("articleId").eqProperty("articleParent.articleId"))
            .setProjection(ProjectionFactoryUtil.max("id"));

articleSub只是您为查询指定的别名。 ProjectionFactoryUtil.max将返回最大值

第二个是实际查询。它将采用第一个查询返回的值:

DynamicQuery query = DynamicQueryFactoryUtil.forClass(JournalArticle.class, "articleParent", PortalClassLoaderUtil.getClassLoader())
            .add(PropertyFactoryUtil.forName("id").eq(subQuery))
            .add(PropertyFactoryUtil.forName("type").eq("Slider"));

执行此DynamicQuery将返回List<JournalArticle>,其中包含生成的SQL语句返回的所有匹配项。

List<JournalArticle> myList = JournalArticleLocalServiceUtil.dynamicQuery(query);