IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JDBC Java Discussion :

Requete avec VIEW en JDBC ?


Sujet :

JDBC Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut Requete avec VIEW en JDBC ?
    Bonjour,

    Après avoir chercher tout l'après midi, j'avais enfin la requête SQL "ultime" pour mon problème ...

    Problème... j'arrive pas à l'executer en Java !!!!

    J'utilise de base Hibernate, mais même en JDBC, je me retrouve avec des execptions ... ou des résultats vides, là où j'ai quelque chose en SQL ... bref ...

    Alors, j'ai en fait 3 requêtes :

    Création de la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CREATE VIEW VU_WEBSESSIONS ( PK_DATE, SESSIONS, HRE, MTE) AS
    	SELECT WEB.PK_DATE, SUM(WEB.AT_OPENSESSIONSCURRENTCOUNT), HOUR(WEB.PK_DATE), MINUTE(WEB.PK_DATE)
    	FROM TB_MB_WEBAPPCRT AS WEB INNER JOIN TB_MB AS MB        ON WEB.PK_MB      = MB.PK_MB
    	                            INNER JOIN TB_JVM AS JVM      ON MB.PK_JVM      = JVM.PK_JVM
    	                            INNER JOIN TB_DOMAINE AS DOM  ON JVM.PK_DOMAINE = DOM.PK_DOMAINE
    	WHERE DOM.PK_PROJET = 1 AND DOM.PK_ENV = 6
    	  AND JVM.ISWEBAPP  = 1
    	  AND MB.PK_MB_TYPE = 6
    	  AND WEB.PK_DATE BETWEEN '2006-01-11 07:30:00' AND '2006-01-12 02:44:05'
    	GROUP BY WEB.PK_DATE
    La requête pour récupérer les données triées:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT MIN(PK_DATE), SUM(SESSIONS), HRE, MTE  FROM VU_WEBSESSIONS GROUP BY HRE,MTE
    Et la supression de la vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    DROP VIEW VU_WEBSESSIONS
    Le but du jeu, c'est de récupérér les 2 premières colonnes de la requête...

    Hibernate n'a pas l'air de gérer les CREATE VIEW, en tout cas me sort des exceptions en rapport avec HQL, bien qu'utilisant createSQLQuery.
    Et en JDBC directement, je n'ai pas de résultats...

    Si une âme charitable pouvait m'éclairer

    NB - Je passe par une vue, parce que mon SGBD (Derby) ne me permet pas de faire un GROUP BY MINUTE(PK_DATE) directement...

  2. #2
    Membre confirmé Avatar de oursblanc
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 81
    Par défaut
    Est-ce que ce n'est pa sta base qui ne gérerait pas les vues ?

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Nan nan, du tout...
    En SQL pur et dur, ca marche nickel.

    Donc les requêtes sont bonnes... c'est juste que j'ai un mal de chien à les intégrer dans le code Java ...

  4. #4
    Membre confirmé Avatar de oursblanc
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 81
    Par défaut
    Un problème de jdbc (fonctionne-t-il ailleurs ?).
    Personnellement, quand je fais des vues (ORCALE 9.2), à partir du java, ça marche.

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Pour JDBC seul, je n'ai pas approfondi.
    Mais dans le reste de l'appli, on utilise Hibernate, et tou fonctionne à merveille ...

    Je ne m'y suis pas encore remis aujourd'hui... sous peu.
    J'aimerai bien passer cette requete quand meme... histoire de pouvoir récupérer mes données en une passe, au lieu des 15 requetes actuelles, + Vector temporaire pour les calculs et somme...

  6. #6
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Pourquoi ne pas laisser ta vue tout simplement plutôt que la recréer à chaque fois ??

  7. #7
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Tout simplement parce que JVM.ISWEBAPP et MB.PK_MB_TYPE dans le WHERE peuvent être diffèrents entre chaques requetes ... ainsi que les dates de recherches.

    Bon, il doit certainement etre possible de préparer les requetes pour passer les paremetres (?1, ?2...)... mais je suis un peu à la ramasse niveau SQL pour le moment. Une bonne mise à jour s'impose.

  8. #8
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Tu adaptes ta vue genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE VIEW VU_WEBSESSIONS ( PK_DATE, SESSIONS, HRE, MTE) AS
       SELECT WEB.PK_DATE, SUM(WEB.AT_OPENSESSIONSCURRENTCOUNT), HOUR(WEB.PK_DATE), MINUTE(WEB.PK_DATE), DOM.PK_PROJET, DOM.PK_ENV, JVM.ISWEBAPP, MB.PK_MB_TYPE, WEB.PK_DATE
       FROM TB_MB_WEBAPPCRT AS WEB INNER JOIN TB_MB AS MB        ON WEB.PK_MB      = MB.PK_MB
                                   INNER JOIN TB_JVM AS JVM      ON MB.PK_JVM      = JVM.PK_JVM
                                   INNER JOIN TB_DOMAINE AS DOM  ON JVM.PK_DOMAINE = DOM.PK_DOMAINE
        GROUP BY WEB.PK_DATE
    Et tu fais ton where après dans ton code Java :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MIN(PK_DATE), SUM(SESSIONS), HRE, MTE  FROM VU_WEBSESSIONS WHERE DOM.PK_PROJET = 1 AND DOM.PK_ENV = 6
         AND JVM.ISWEBAPP  = 1
         AND MB.PK_MB_TYPE = 6
         AND WEB.PK_DATE BETWEEN '2006-01-11 07:30:00' AND '2006-01-12 02:44:05'
    GROUP BY HRE,MTE

  9. #9
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    J'suis pas sur qu'elle colle ta clause where...

    Bon, je sais pas trop ou je me plantais ... surement une embrouille avec les sessions... mais c'est bon, ca marche now.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    Vector cumul = new Vector();
     
    Session session = HibernateUtil.getSession();
    Statement stmt = session.connection().createStatement();
    stmt.executeUpdate(("CREATE VIEW VU_WEBSESSIONS ( PK_DATE, SESSIONS, T_TIME) AS " +
    	"SELECT WEB.PK_DATE, SUM(WEB.AT_OPENSESSIONSCURRENTCOUNT), (MONTH(WEB.PK_DATE)*1000000) + (DAY(WEB.PK_DATE)*10000) + (HOUR(WEB.PK_DATE)*100) + MINUTE(WEB.PK_DATE) " +
    	"FROM TB_MB_WEBAPPCRT AS WEB INNER JOIN TB_MB AS MB        ON WEB.PK_MB      = MB.PK_MB " +
    	                            "INNER JOIN TB_JVM AS JVM      ON MB.PK_JVM      = JVM.PK_JVM " +
    	"WHERE JVM.PK_DOMAINE = " + domaine + 
    	  "AND JVM.ISWEBAPP  = 1 " +
    	  "AND MB.PK_MB_TYPE = 6 " +
    	  "AND WEB.PK_DATE BETWEEN '"+fromDateTime+"' AND '"+toDateTime+"' " +
    	"GROUP BY WEB.PK_DATE"));
     
    ResultSet rs = stmt.executeQuery("SELECT MIN(PK_DATE), SUM(SESSIONS), T_TIME  FROM VU_WEBSESSIONS GROUP BY T_TIME");
    while(rs.next()){
    	cumul.add(new Second(rs.getTimestamp(1)),rs.getInt(2));
    }
     
    stmt.executeUpdate("DROP VIEW VU_WEBSESSIONS");
     
    stmt.close();
    HibernateUtil.closeSession();

  10. #10
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par iamthemitch
    J'suis pas sur qu'elle colle ta clause where...
    C'est clair qu'elle ne marche pas en l'état. Les alias de colonnes vont faire planter. C'était juste pour donner rapidement l'idée.
    N'empêche même si ton truc marche, c'est vraiment pas propre de créer une vue pour systématiquement la détruire après.

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2006
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 9
    Par défaut
    Je sais bien que c'est pas le plus propre... si vous avez mieux à proposer, je suis tout ouie !

    Mais la problématique est que:
    - mon SGBD (Derby) ne gère que les colonnes sur le GROUP BY. Donc il m'est impossible de faire un GROUP BY MINUTE(PK_DATE).
    - la requête est appelé à chaque génération de graphique. Les paramètres PK_DATE, et PK_DOMAINE étant diffèrent à chaque fois.
    - la requête est appelée dans une classe Java propre au graphe, qui est appelée à chaque génération du graphe (servlet)

    donc comment faire ...

    1/ ancienne solution. Je reste avec Hibernate (qui ne gere pas les views), et fait les 15 requetes sur TB_MB séparement pour chaque PK_MB, avant de mouliner tous les résultats en Java afin de faire les sommes.
    2/ solution actuelle. Une view à chaque usage interrogée en JDBC.
    3/ autre ? une vue ne bougeant pas, permettant de faire une recherche sur la date et le domaine, et ayant la SUM par minute des données.

    Sachant qu'il y a 5.000 valeurs par jour et par TB_MB... je ne sais pas trop quelle solution est la plus clean/efficace que ce soit pour le code Java et/ou le SGBD...

  12. #12
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Solution 3, à la façon que j'ai montré plus haut.

    Si tu as des index sur les clés que tu utilises pour tes jointures ça sera performant et propre.

Discussions similaires

  1. requete avec la valeur NULL
    Par Hinkel dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 12/11/2008, 16h39
  2. [JDBC]requete avec PreparedStatement
    Par pino dans le forum JDBC
    Réponses: 2
    Dernier message: 23/02/2006, 11h43
  3. requete avec OBCD et visual c++
    Par Anonymous dans le forum MFC
    Réponses: 12
    Dernier message: 18/11/2004, 16h15
  4. Réponses: 13
    Dernier message: 10/05/2004, 16h49
  5. Requete avec des décimales
    Par Sandrine75 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 27/06/2003, 10h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo