Приведение 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


person Navankur Chauhan    schedule 26.09.2017    source источник


Ответы (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);
person jorgediaz-lr    schedule 26.09.2017
comment
Это сработало абсолютно нормально для меня :) Большое спасибо :) - person Navankur Chauhan; 28.09.2017