2016-05-22 1 views
3

Je passe le tableau de valeurs longues et essaie d'obtenir les enregistrements pertinents Mais il lance une erreur Le paramètre de position n'est pas défini.Erreur lors de la récupération des enregistrements à l'aide de la requête personnalisée dans Liferay

Voici le 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); 
    } 

Recherche

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

Toute aide serait appréciée.

+1

[Cette question] (http://stackoverflow.com/questions/10816676/liferay-custom-sql-using-in-operator) semble pertinente à votre problème. –

+0

@TimBiegeleisen: elle passe la chaîne comme paramètre pendant que je passe devant Array of Long. La solution fournie n'est pas la bonne façon. QueryPos fournit une API pour transmettre des valeurs de tableau en tant que paramètre dans la requête sql. J'ai obtenu la référence à partir de ce lien http://chingovan.blogspot.in/2016/01/liferay-custom-dynamic-query-with-array.html –

+0

Vous devez convertir votre tableau en chaîne CSV (valeurs séparées par des virgules). –

Répondre

0

Je recommande d'analyser votre requête à DinamycQuery API à la place. Cela a de nombreux avantages car vous n'avez pas à gérer le cycle de vie de la session et que vous obtenez directement une liste d'objets du modèle liferay.

Un exemple serait:

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

yes Dynamic Query permet de résoudre ce problème, mais le projet exige l'utilisation de la requête SQL personnalisée. –