2017-09-26 32 views
0

我一直在使用项目的动态查询。将strint转换为liferay动态查询中的整数

这是我遇到的问题。

对于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

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

例如,我使用下面的代码,以获得所谓的“内容”的字符串列的最大长度:

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); 
+0

这工作绝对是对我很好:)非常感谢:) –