在 liferay 动态查询中将字符串转换为整数
Casting Strint to integer in liferay dynamic query
我一直在为一个项目使用动态查询。
这是我遇到问题的场景。
对于 table 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
尝试使用ProjectionFactoryUtil.sqlProjection方法。
该方法允许使用由 SQL 引擎执行的函数。
例如,我使用以下代码来获取名为 'content' 的字符串列的最大长度:
Projection maxSizeProjection = ProjectionFactoryUtil.sqlProjection(
"max(length(content)) as maxSize", new String[] {"maxSize"},
new Type[] {Type.BIG_DECIMAL});
如果您想在条件中使用 SQL 函数,使用 RestrictionsFactoryUtil.sqlRestriction 的动态查询条件也可以完成同样的事情。
对于您的情况,请尝试以下代码:
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);
我一直在为一个项目使用动态查询。
这是我遇到问题的场景。
对于 table 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
尝试使用ProjectionFactoryUtil.sqlProjection方法。 该方法允许使用由 SQL 引擎执行的函数。
例如,我使用以下代码来获取名为 'content' 的字符串列的最大长度:
Projection maxSizeProjection = ProjectionFactoryUtil.sqlProjection(
"max(length(content)) as maxSize", new String[] {"maxSize"},
new Type[] {Type.BIG_DECIMAL});
如果您想在条件中使用 SQL 函数,使用 RestrictionsFactoryUtil.sqlRestriction 的动态查询条件也可以完成同样的事情。
对于您的情况,请尝试以下代码:
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);