2016-07-08 1 views
1

Je suis nouveau à apache métamodèle. Je l'utilise pour obtenir la somme d'une colonne numérique dans une table de base de données en utilisant le code suivant:Apache metamodel lance une exception en essayant d'obtenir la somme d'un très grand nombre de données numériques

 Object object = null; 
     long sum = 0; 
     String columnName = table.getColumn(iColumnNumber).getName(); 
     Query query = dataContext.query().from(table).select(FunctionType.SUM, table.getColumnByName(sColumnName)).toQuery(); 
     org.eobjects.metamodel.data.DataSet ds = dataContext.executeQuery(query); 
     try { 
      ds.next(); 
      org.eobjects.metamodel.data.Row row = ds.getRow(); 
      try { 
       object = row.getValue(0); 
      } catch (Exception ex) { 
       return 0; 
      } 
      if (object instanceof java.lang.Long) { 
       sum = (long) object; 
      } else if (object instanceof BigDecimal) { 
       sum = ((BigDecimal) object).longValue(); 
      } else if (object instanceof java.lang.Integer) { 
       sum = ((java.lang.Integer) object).longValue(); 
      } 

     } catch (Exception ex) { 
      return 0; 
     } finally { 
      if (ds != null) { 
       ds.close(); 
      } 
     } 

Le code fonctionne très bien pour les petites données, mais lorsque je tente le même code pour les données très importantes contenant des centaines de milliers de lignes . Le code lève une exception: Impossible d'obtenir l'enregistrement suivant dans le jeu de résultats: Erreur de dépassement arithmétique lors de la conversion de l'expression en type de données int.

Lorsque j'exécute la même requête en utilisant la fonction sum sur la table de base de données directement dans la fenêtre de script dbms, j'obtiens la même erreur. Si je lance le résultat de la fonction sum() dans un type de données bigint ou numérique, la requête renvoie la somme sans donner d'erreur. Par conséquent, je pense que cette erreur peut être résolue en transposant le résultat de la fonction sum() dans un type de données approprié dans apache metamodel également. Donc, quelqu'un peut-il me dire comment je peux lancer le résultat de la requête dans un autre type de données tel que décimal au lieu du type par défaut int.

Répondre

0

D'abord quelques petites remarques sur votre code:

  • Attention à avaler des exceptions. Vous devriez au minimum enregistrer les exceptions qui se produisent - en ce moment vous venez de renvoyer 0 ce qui est trompeur.
  • Au lieu de gérer différemment les nombres entiers, longs, etc., pourquoi ne pas laisser votre méthode renvoyer Number?

En ce qui concerne la question de dépassement Arithmétique, si votre base de données retourne vraiment BigDecimal (assez inhabituel, mais les bases de données sont parfois comme ça), alors vous devriez probablement à des questions/réponses telles que Converting BigDecimal to Integer