我使用Service Builder构建了一个Liferay portlet,它有一个表。其中一个字段包含一个名为“ZValue”的双精度值。我需要向我的-LocalServiceImpl.java文件添加一个公共方法,该方法将返回当前在“ZValue”字段中找到的最大值。 我希望有一个类似于DynamicQuery的Liferay类,而不是返回单个值。我知道我可以返回所有记录并自行循环以获得最大值,但我确信有一种更简单的方法来获得最大值。
我在搜索stackoverflow时发现的是:
DynamicQuery query = DynamicQueryFactoryUtil.forClass(classname);
query.setProjection(ProjectionFactoryUtil.max("ZValue"));
但我不明白如何实际返回值,因为DynamicQuery返回列表而不是单个值。
答案 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);