2017-09-26 1 views
0

Ich habe dynamische Abfrage für ein Projekt verwendet.Casting Strint zu Integer in Liferay dynamische Abfrage

Hier ist ein Szenario, für das ich ein Problem habe.

Eine Tabelle xyz die Spalte version als varchar (ich weiß, es ist ein schlechtes Design, aber es ist zu spät zu ändern) gespeichert und Werte wie 9,12 hat.

Für die Abfrage:

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

Ich bin die Ausgabe als 9 statt 12

Die dynamische Abfrage für das gleiche bekommen ist:

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

Die Abfrage, die geben wird der korrekte Wert ist:

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

Jetzt möchte ich es in der dynamischen Abfrage, wie kann ich das tun?

Ich bin mit Liferay-6.2-ce

Antwort

1

Versuchen ProjectionFactoryUtil.sqlProjection Methode. Diese Methode ermöglicht die Verwendung von Funktionen, die von SQL Engine ausgeführt werden.

Zum Beispiel verwende ich folgenden Code, um ‚Inhalt‘ genannt maximale Länge eines String-Spalte zu erhalten:

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

Das gleiche mit dynamischen Abfragekriterien werden kann RestrictionsFactoryUtil.sqlRestriction geschieht mit für den Fall, dass Sie eine SQL-Funktion in einer Bedingung verwenden möchten.

In Ihrem Fall versuchen folgenden Code:

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

Dieses :) Danke für mich absolut in Ordnung war viel :) –

Verwandte Themen