Toon posts:

[Java] Resultaten query in een hashtable

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik probeer door middel van de volgende code resultaten uit een query in een hashtable te toveren
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public Hashtable retrieveAllProjectInformation() {
        hash = new Hashtable();
         try {
            connection = database.connect();
            preparedStatement = connection.prepareStatement("SELECT * FROM project");
            resultSet = database.executeSelectionQuery(preparedStatement);
            rsMetaData = resultSet.getMetaData();
            while (resultSet.next()) {
                for (int i = 1; i <= rsMetaData.getColumnCount(); i++) {
                    hash.put(rsMetaData.getColumnName(i), resultSet.getString(i));
                   
                }
            }
            database.closeConnection();
        } catch (ClassNotFoundException e) {
            System.out.println(e.getMessage());
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        } 
        return hash;        
    }


Het doet wat het moet doen, althans gedeeltelijk. Het slaat (logisch) alleen de kolom namen en waarden van de laatste rij op in de Hashtable. Nu is het eigenlijk de bedoeling alle query resultaten in de hashtable voor te laten komen, maar weet ik eigenlijk niet zo heel goed hoe ik dit voor elkaar moet krijgen...

Kan iemand wat licht op de zaak werpen, zit er een beetje in vast

  • B-Man
  • Registratie: Februari 2000
  • Niet online
Een hashtable verwacht unieke keys, dus als je na rij 1 de tweede rij uitleest, dan wordt onder dezelfde kolomnaam de waarde van de tweede rij opgeslagen.

Wat jij wil is een tweedimensionaal 'array': voor iedere gevonden rij alle kolommen opslaan.

Een rudimentair voorbeeld:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public Hashtable<int, Hashtable<String,Object>> retrieveAllProjectInformation() { 
    ArrayList<Hashtable<String,Object>> hash = new ArrayList<Hashtable<String,Object>>(); 
    try { 
        connection  = database.connect();
        preparedStatement = connection.prepareStatement("SELECT * FROM project"); 
        resultSet = database.executeSelectionQuery(preparedStatement); 
        rsMetaData = resultSet.getMetaData(); 
        while (resultSet.next()) { 
            Hashtable<String,Object> row = new Hashtable<String,Object>();
            hash.add( row );
            for (int i = 1; i <= rsMetaData.getColumnCount(); i++) {
                row.put( rsMetaData.getColumnName(i), resultSet.getString(i) ); 
            } 
        } 
        database.closeConnection(); 
    } catch (ClassNotFoundException e) { 
        System.out.println(e.getMessage()); 
    } catch (SQLException e) { 
        System.out.println(e.getMessage()); 
    }  
    return hash;         
}


Je slaat zo alle separate rijen op in een algemene hashtable, die per rij een hashtable met kolomwaarden bevat.

[ Voor 2% gewijzigd door B-Man op 21-11-2006 17:04 . Reden: ArrayList ipv Hashtable, hash is nergens voor nodig ]


Verwijderd

Topicstarter
Bedankt voor je reply waar ik zelf echter aan zat te denken is het opslaan van verschillende ArrayLists (oid) in de hashmap zelf.

code:
1
2
3
4
Hashmap
     [1] Arraylist
             [1] Kolomnaam
             [2] Waarde


Zoiets dergelijks, ik hoop dat je een beetje een idee hebt wat ik bedoel (ik heb tot dusver niet naar concrete implementatie mogelijkheden gekeken, dit is dus wel iets wat je een brainfart kan noemen).
ArrayList ipv Hashtable, hash is nergens voor nodig
Helaas ontkom ik niet aan de Hashtable, softwarematige beperking.

[ Voor 13% gewijzigd door Verwijderd op 21-11-2006 17:10 ]


  • B-Man
  • Registratie: Februari 2000
  • Niet online
Leg dan eerst eens het volgende uit:
- Waarom een Hashtable?
- Moet je uberhaupt de gegevens van _alle_ projecten ophalen, of die van 1 project?
- Waarom een hashtable als je gegevens van meerdere projecten moet ophalen?
- Wat voor inhoud van de hashtable verwacht de code die deze functie aanroept?
- Softwarematige beperking?

Een ArrayList is een OO versie van een (flat) array, daar sla je dus enkel objecten in op zonder key.
Je voorbeeld is dus niet direct mogelijk, tenzij je tussen je arraylist en je data weer een hashmap/hashtable zet.

Verwijderd

Topicstarter
-Hashtable omdat: de software waar de data naar toe gestuurd wordt een Hashtable verwacht. Jammer, maar daar kan ik verder geen implementatie veranderingen in aanbrengen.

-Nee, momenteel hoeft dit niet per sé ik zou ook eerst een lijst kunnen maken met alleen bijvoorbeeld de projectnamen en id's.

-Zelfde reden als punt 1 :)

Ik zie het probleem ook wel en snap heel goed dat het met een "standaard" Hashtable niet mogelijk is uit te voeren wat ik wil. Dus dacht ik wat leuks te verzinnen om zoveel mogelijk data binnen de Hashtable te verpakken :+ .

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 17:46

Robtimus

me Robtimus no like you

Ik zie zo twee oplossingen:
- Een List van Hashtables, 1 voor elke row
- Een Hashtable met als key de column naam en als value een List met waarden.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Topicstarter
Een dergelijke constructie had ik inderdaad voor ogen, wist alleen niet zeker of dat ook echt een goede oplossing was.
Pagina: 1