2017-09-10 1 views
1

Je veux créer un rapport que vous sélectionnez product et storeName et renvoie toutes les ventes par date (dans une plage).Java Map <Chaîne, Carte <Chaîne, Entier> utiliser pour remplir les résultats

La vue db qui m'a aidé avec d'autres rapports ressemble à ceci: produit - store_name - Date

Jusqu'à présent, mon approche est de renvoyer tous les enregistrements de la db dans une liste et je procédez comme suit:

public void salesReport(String product, String store, String date){ 
    List<RecordSalesInfo> salesResults = salesDao.getSales(); 
    Map<String, Integer> mapper = new HashMap(); 

    //calculation 
     for (RecordSalesInfo record : salesResults) { 
      StringBuilder key = new StringBuilder(); 
      key.append(record.getProduct()).append(":") 
         .append(record.getStoreName()).append(":") 
         .append(record.getWageredDate()).append(":"); 

      if (mapper.containsKey(key.toString())) { 
        Integer get = mapper.get(key.toString()); 
        get++; 
        mapper.put(key.toString(), get); 
      } else { 
        mapper.put(key.toString(), 1); 
      } 
     } 

     for (String key : mapper.keySet()) { 
      if(key.toString.equals("Pen:London:13June2016"){ 
       System.out.println("sales:" + mapper.get(key.toString); 
      } 
     } 
} 

la requête dans le salesDao (économie comme "RecordSalesInfo") est:

SELECT 
rs.product AS product, 
rs.store_name AS store, 
rs.date AS date, 
rs.product_id AS productId 
FROM sales rs 
ORDER BY rs.product,rs.store_name,rs.date 

la raison pour laquelle je ne l'ai pas qUERY « Count (blabla) où product = 'a' et store_name = 'b' et date = 'c' "est parce que l'utilisateur modifie très souvent l'entrée en utilisant un jSlider (input = product, store, date), ce qui signifie trop de requêtes. J'ai donc pensé qu'il est préférable de prendre tous les résultats de DB puis d'afficher ce dont l'utilisateur a besoin. A) Y a-t-il un meilleur moyen de le faire?

B) Dans la phase suivante de l'utilisateur entrera seulement le produit et le magasin et je dois retourner la liste des ventes par date, qui ressemble à ceci:

Pen - Londres (entrée manuelle) 12June2016 100 15June2016 30 19July2016 67

Avec ce que je l'ai fait jusqu'à présent, je ne peux pas seulement les dates que je les ventes, et je dois « recherche » de la hashmap pour toutes les dates (gamme spécifique). Je pense comme une solution pour changer la clé de "product: storeName" une carte existante et avoir comme valeur une autre carte où la chaîne sera la date et l'entier le montant des ventes.

Encore une fois, y a-t-il une meilleure façon de faire cela?

Répondre

2

Ce que je ferais est que je ne retiendrai pas/garder une carte, plutôt je vais chercher les résultats que les modifications de la requête en fonction de la JSlider etc.

Vous pouvez faire une chose que lorsqu'une requête est envoyée Jusqu'à ce que ses résultats soient disponibles, vous pouvez désactiver votre Jslider et afficher un spinner qui informe l'utilisateur que le traitement est en cours.

Une fois que le résultat est disponible, activez le curseur et masquez le disque.

Avoir toutes les données sur la carte ne semble pas une bonne idée. Ce sera un état de données déconnecté.

+0

merci pour votre réponse. Pensez-vous que quoi que je fasse avec la carte, il existe une autre façon de le faire avec Java, ou la meilleure façon d'utiliser les requêtes? –