2016-05-22 7 views
3

Ich übergeben Array von langen Werten und versuchen, die relevanten Datensätze zu erhalten, aber es wirft einen Fehler Positional Parameter ist nicht definiert.Fehler beim Abrufen von Datensätzen mit benutzerdefinierten Abfrage in Liferay

Hier ist der Code

try { 
      String list = CustomSQLUtil.get(id of the query); 
      SQLQuery sqlQuery = session.createSQLQuery(list); 
      sqlQuery.setCacheable(false); 
      QueryPos q=QueryPos.getInstance(sqlQuery); 
      q.add(array of long values); 
      return processObjectListToEntityList(QueryUtil.list(sqlQuery, getDialect() ,QueryUtil.ALL_POS, QueryUtil.ALL_POS)); 
    } 
    catch(Exception e){ 
     log.error("Error while Fetching Records " + e); 
    } finally{ 
     closeSession(session); 
    } 

Abfrage

SELECT 
    entity1.name 
FROM 
    entityOne as entity1 
JOIN 
    entityTwo as entity2 
WHERE 
    entity1.id = entity2.id 
AND 
    entity2.id IN (?); 

Jede Hilfe würde geschätzt.

+1

[Diese Frage] (http://stackoverflow.com/questions/10816676/liferay-custom-sql-using-in-operator) scheint für Ihr Problem relevant. –

+0

@TimBiegeleisen: Sie gibt String als Parameter weiter, während ich Array of Long übergebe. Die angebotene Lösung ist nicht der richtige Weg. QueryPos stellt eine API bereit, um Array-Werte als Parameter in der SQL-Abfrage zu übergeben. Ich habe Referenz von diesem Link http://chingovan.blogspot.in/2016/01/liferay-custom-dynamic-query-with-array.html –

+0

Sie müssen Ihr Array in CSV (Komma getrennte Werte) Zeichenfolge konvertieren. –

Antwort

0

Ich empfehle, Ihre Abfrage stattdessen DinamycQuery API analysieren. Dies hat viele Vorteile, da Sie den Sitzungslebenszyklus nicht verwalten müssen und eine Liste von liferay-Modellobjekten direkt erhalten.

wäre ein Beispiel:

DynamicQuery dynamicQuery = DynamicQueryFactoryUtil.forClass(AssetCategory.class, PortalClassLoaderUtil.getClassLoader()); 
Property nameProperty = PropertyFactoryUtil.forName("name"); 
Property groupIdProperty = PropertyFactoryUtil.forName("groupId"); 
dynamicQuery.add(nameProperty.eq(name)); 
dynamicQuery.add(groupIdProperty.eq(groupId)); 
List<AssetCategory> categoriesByName = AssetCategoryLocalServiceUtil.dynamicQuery(dynamicQuery); 
+0

Ja Dynamische Abfrage hilft, dieses Problem zu lösen, aber das Projekt erfordert die Verwendung von SQL-Abfragen. –