在liferay动态查询中将Strint强制转换为整数

时间:2017-09-26 11:19:52

标签: liferay liferay-6 dynamicquery

我一直在为项目使用动态查询。

以下是我遇到问题的情况。

对于表格xyz,列version存储为varchar(我知道这是一个糟糕的设计,但现在更改为时已晚)并且值为9,12

对于查询:

select max(version) 
from xyz 
where something = 'abc';

我的输出为9而不是12。

相同的动态查询是:

ClassLoader classLoader = PortletBeanLocatorUtil.getBeanLocator(ClpSerializer.getServletContextName()).getClassLoader();

DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(xyz.class, classLoader);
                    dynamicQuery.setProjection(ProjectionFactoryUtil.max("version"));
                    dynamicQuery.add(PropertyFactoryUtil.forName("something").eq("abc"));

List<Object> list = xyzLocalServiceUtil.dynamicQuery(dynamicQuery);

提供正确值的查询是:

select max(cast(version as signed)) 
from xyz 
where something = 'abc';

现在,我希望它在动态查询中,我该怎么做?

我正在使用liferay-6.2-ce

1 个答案:

答案 0 :(得分:1)

尝试使用 ProjectionFactoryUtil.sqlProjection 方法。 该方法允许使用由SQL引擎执行的函数。

例如,我使用以下代码来获取名为&#39; content&#39;

的字符串列的最大长度
Projection maxSizeProjection = ProjectionFactoryUtil.sqlProjection(
        "max(length(content)) as maxSize", new String[] {"maxSize"},
        new Type[] {Type.BIG_DECIMAL});

使用 RestrictionsFactoryUtil.sqlRestriction 进行动态查询标准可以做同样的事情,以防您想在条件中使用SQL函数。

在您的情况下,请尝试以下代码:

import com.liferay.portal.kernel.dao.orm.ProjectionFactoryUtil;
import com.liferay.portal.kernel.dao.orm.Type;

...

Projection maxSizeProjection = ProjectionFactoryUtil.sqlProjection(
        "max(cast(version as signed)) as maxVersion",
        new String[] {"maxVersion"}, new Type[] {Type.BIG_DECIMAL});

dynamicQuery.setProjection(maxSizeProjection);