2017-08-09 1 views
1

J'ai ce comportement étrange avec la méthode Hibernate SQLQuery.list().La méthode de liste Hibernate SQLQuery renvoie un objet à la place du tableau d'objets

Après la description de la question:

J'ai une requête SQL select qui récupère uniquement une seule colonne (groupe) à partir de la base de données (c.-à-select group from peopleGroup where groupid = 10) et je RECEVOIR le résultat de la liste ci-dessus dans la liste des objets tableau
-à-dire,

SQLQuery hQuery = session.createSQLQuery("select group from peopleGroup where groupid = 10"); 
List<Object[]> result = (List<Object[]>)hQuery.list(); 

Idéalement, le résultat doit contenir une liste de tableaux d'objets, mais quand je visite, l'indice du résultat 0 des objets contient String au lieu d'un Ob tableau de ject.
Toutefois, si je l'utilise plus d'une colonne, disons 2 colonnes dans la clause select de la requête, j'ai pu voir que l'indice 0 des résultats sous forme de tableau d'objets-à-dire, Object[2]={"group","groupid"};

Comment puis-je obtenir la Tableau d'objets même si je n'ai qu'une seule colonne mentionnée dans la clause select de la requête?

+2

Vous ne voudriez pas ..... –

Répondre

1

Docs états:

liste de la liste()

Retour les résultats de la requête en liste. Si la requête contient plusieurs résultats par ligne, les résultats sont renvoyés dans une instance de Object [].

Convertissez-le par vous-même, comme ça.

List<Object[]> l = new ArrayList<>(); 
for(Object o : query.list()) { 
    Object[] arr = {o}; 
    l.add(arr); 
} 
+0

Je comprends le doc maintenant mais ai-je l'option de réaliser mon but qui est pourtant j'ai la colonne simple dans la clause de sélection je dois mettre cet objet retourné dans le tableau d'objet? – VRaj

+0

Convertissez-le par vous-même. Ajouter un exemple –

0

vous pouvez créer un mappeur objet comme ci-dessous le code

public class QueryMapper { 
    private String group; 
    //setter and getter 
    } 

Et vous devez changer votre code comme ci-dessous

SQLQuery hQuery = session.createSQLQuery("select group from peopleGroup where groupid = 10"); 
List<Object[]> result = (List<Object[]>)hQuery.list(); 

List<QueryMapper> list = new ArrayList<QueryMapper>(); 

     for(Object[] object: result){ 
      QueryMapper queryMapper = new QueryMapper(); 
      if(object[0]!=null){ 
       queryMapper.setGroup((String)object[2]); 
      } 
      list.add(queryMapper); 
     } 
0

Tout ce que je voulais est de fixer le ClassCastException qui a été intercepté lors de l'affectation de result.get (0) au conteneur, c'est-à-dire container = result.get (0); Puisque la valeur renvoyée par la méthode list() mentionnée contient un objet dans le cas d'une seule colonne dans la clause select de la requête et que je ne serai pas autorisé à passer de certain objet à Object [] (Object array). Au lieu de cela, j'ai essayé un travail autour comme ci-dessous

code existant déjà

SQLQuery hQuery = session.createSQLQuery("select group from peopleGroup where groupid = 10"); 
List<Object[]> result = (List<Object[]>)hQuery.list(); 
Object[] container = result.get(0); 

maintenant j'ai mis condition comme ci-dessous pour décider comment attribuer une valeur à la Object[]

SQLQuery hQuery = session.createSQLQuery("select group from peopleGroup where groupid = 10"); 
List<Object[]> result = (List<Object[]>)hQuery.list(); 
Object[] container = null; 
if(result.get(0) instanceof Object[]) 
    container = result.get(0); 
else { 
    container = new Object[1]; 
    container[0] = result.get(0); 
     } 

La solution ci-dessus semble travailler dans mon cas!