2017-09-26 5 views
0

私はプロジェクトに対して動的クエリを使用しています。生命の動的クエリでは、Strintを整数にキャストする

ここで私は問題に直面しているシナリオです。コラムversion XYZ表について

varchar(私はそれが悪いデザインだけど、それは今変更するには遅すぎるのです)と 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); 

与えているクエリ:同じのための動的なクエリである代わりに、12

の9として、私は出力を取得しています

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

正しい値は次のとおりです。

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

これはたくさん感謝:)私のために絶対にうまく働いた:):あなたのケースでは

次のコードを試してみてください –

関連する問題