2017-09-26 75 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

這工作絕對是對我很好:)非常感謝:) –