2

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

我在搜索 stackoverflow 时发现的是:

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

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

4

2 回答 2

2

在下面的示例中,我们查询 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);
于 2014-06-12T20:12:42.017 回答
0

Liferay 7.2 dxp sp5

import com.liferay.portal.kernel.dao.orm.Criterion;
import com.liferay.portal.kernel.dao.orm.DynamicQuery;
import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil;
import com.liferay.portal.kernel.dao.orm.PropertyFactoryUtil;
import com.liferay.portal.kernel.dao.orm.RestrictionsFactoryUtil;

在我的情况下,我想获取列的最大值,所以我使用了这个查询

DynamicQuery dynamicQuery = MyTableLocalServiceUtil.dynamicQuery();
dynamicQuery.setProjection(ProjectionFactoryUtil.max("columnName1"));
DynamicQuery dynamicQuery2 = MyTableLocalServiceUtil.dynamicQuery();
dynamicQuery2.add(PropertyFactoryUtil.forName("columnName1").eq(dynamicQuery));
List<Object> dynamicQuery3 = MyTableLocalServiceUtil.dynamicQuery(dynamicQuery2);

这将返回一个列表,但在“columnName1”列中具有最大值。在这里我观察到一件事,如果 columnName1 具有多个最大值,那么它将返回该列数。支持如果 columnName1 的最大值为 50 但 3 行有 50,那么它将在列表中返回 3 个对象。

第二种情况:找到 columnName1 和 columnName2=anyValue 的最大值

DynamicQuery dynamicQuery = MyTableLocalServiceUtil.dynamicQuery();
dynamicQuery.setProjection(ProjectionFactoryUtil.max("columnName1"));
DynamicQuery dynamicQuery2 = MyTableLocalServiceUtil.dynamicQuery();
dynamicQuery2.add(PropertyFactoryUtil.forName("columnName2").eq(anyValue));
dynamicQuery2.add(PropertyFactoryUtil.forName("columnName1").eq(dynamicQuery));
List<Object> dynamicQuery3 = MyTableLocalServiceUtil.dynamicQuery(dynamicQuery2);

在这种情况下,我发现 columnName1 和 columnName2=anyValue 的最大值的动态查询和操作。如果 columnName2=anyValue 的行没有 columnName1 的最大值,则它返回空列表。

于 2022-01-24T13:31:49.280 回答