【问题标题】:Need to find Max Value in Liferay table using Service Builder需要使用 Service Builder 在 Liferay 表中查找最大值
【发布时间】:2022-01-24 21:31:49
【问题描述】:

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

我在搜索 stackoverflow 时发现的是:

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

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

【问题讨论】:

  • 您可以编写两个动态查询,一个用于获取最大值字段,第二个用于获取字段最大值的所有行。

标签: liferay liferay-service-builder


【解决方案1】:

在下面的示例中,我们查询 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);

【讨论】:

  • 感谢您的回复。我最终使用了一个动态查询,但在查询中添加了一个 desc 订单,然后使用 query.setLimit(0,1) 返回第一项。
【解决方案2】:

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 的最大值,则返回空列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 2021-06-19
    相关资源
    最近更新 更多