2017-09-26 8 views
0

J'ai utilisé la requête dynamique pour un projet.Casting Strint à nombre entier dans la requête dynamique liferay

Voici un scénario pour lequel je suis confronté à un problème.

Pour une table xyz la colonne version est stockée sous forme varchar (je sais que c'est une mauvaise conception, mais il est trop tard pour changer maintenant) et a des valeurs comme 9,12.

Pour la requête:

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

Je reçois la sortie comme 9 au lieu de 12.

La requête dynamique est la même:

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

La requête qui donne la valeur correcte est:

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

Maintenant, je veux que ce soit dans la requête dynamique, comment puis-je faire cela?

J'utilise la méthode Liferay-6.2-ce

Répondre

1

Essayez d'utiliser ProjectionFactoryUtil.sqlProjection. Cette méthode permet d'utiliser des fonctions exécutées par le moteur SQL.

Par exemple, je suis en utilisant le code suivant pour obtenir la longueur maximum d'une colonne de chaîne appelée « contenu »:

Projection maxSizeProjection = ProjectionFactoryUtil.sqlProjection(
     "max(length(content)) as maxSize", new String[] {"maxSize"}, 
     new Type[] {Type.BIG_DECIMAL}); 

La même chose peut être fait avec des critères de requête dynamiques à l'aide RestrictionsFactoryUtil.sqlRestriction dans le cas où vous souhaitez utiliser une fonction SQL dans une condition.

Dans votre cas, essayez le code suivant:

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

Cela a fonctionné tout à fait bien pour moi :) Merci beaucoup :) –