Relazione presente nel db ma non trovata da java

di il
6 risposte

Relazione presente nel db ma non trovata da java

Voglio recuperare un impiegato dal db cercandone il nome, il codice da me scritto è:
public class ImpiegatoDAO extends Impiegato {
private Connection con;
	
	
	public ImpiegatoDAO(Connection c) {
		con = c;
	}
	
	public void RicercaImpiegatobyNome(String nome) {
		ArrayList<Impiegato> af = getImpiegatoByNome(nome);
		if(af.isEmpty())
			System.out.println("Impiegato non trovato");
		else
			for(Impiegato f: af) {
				System.out.println(f.toString());
			}
	}
public ArrayList<Impiegato> getImpiegatoByNome(String nome) {
		
		ResultSet result;
		Impiegato I;
		ArrayList<Impiegato> ai = new ArrayList<Impiegato>();
		
		String query = "select * from impiegato where Nome=?";
		
		try {
			PreparedStatement pst = con.prepareStatement(query);
			pst.setString(1,nome);
			result = pst.executeQuery();
			
				while(result.next()) {
					I = new Impiegato();
					I.setNome(result.getString(1));
					I.setCognome(result.getString(2));
					I.setDataNascita(result.getString(3));
					I.setDataAssunzione(result.getString(4));
					I.setStipendio(result.getDouble(5));
					I.setCf(result.getString(6));
					I.setIdOperatore(result.getString(7));
					I.setEmail(result.getString(8));
					I.setCell(result.getString(9));
					I.setSesso(result.getString(10));
					I.setPsw(result.getString(11));
					ai.add(I);
				}
				return ai;
			
		} catch (SQLException e) {e.printStackTrace();return null;}
	}
Lanciando dalla classe main questo metodo a cui viene passato il nome, mi viene detto che la relazione impiegato all'interno del database non esiste!!(esiste invece)
Allora siccome postgresql mi fa specificare una relazione in questo modo:
"Negoziodiabbigliamento"."Impiegato" dove la prima parte è il nome dello schema e la seconda parte è il nome della relazione allora ho pensato "Ora ci aggiungo tutta questa definizione nella query", NADA!!!!
Cercando su internet ho trovato che i doppi apici indicano il casesensitive ma, posso aggiungere questo casesensitive nella specifica della query in java?? posso rimuovere questi doppi apici da postgresql? Sto impazzendo perchè è il mio primo programma che interagisce con un db e la connessione va a buon fine , sono ad un passo dalla vittoria

6 Risposte

  • Re: Relazione presente nel db ma non trovata da java

    indisparte ha scritto:


    Lanciando dalla classe main questo metodo a cui viene passato il nome, mi viene detto che la relazione impiegato all'interno del database non esiste!!(esiste invece)
    Ma hai una eccezione in esecuzione? Precisa quale allora.

    indisparte ha scritto:


    "Negoziodiabbigliamento"."Impiegato" dove la prima parte è il nome dello schema e la seconda parte è il nome della relazione allora ho pensato "Ora ci aggiungo tutta questa definizione nella query", NADA!!!!
    Se sei connesso al database giusto e con la giusta utenza, NON serve qualificare la tabella.

    indisparte ha scritto:


    Cercando su internet ho trovato che i doppi apici indicano il casesensitive
    Quali doppi apici? Quelli che racchiudono le stringhe letterali in Java? Non c'entrano nulla con il case-sensitive o meno.

    indisparte ha scritto:


    ma, posso aggiungere questo casesensitive nella specifica della query in java?? La sintassi SQL in generale è case INsensitive. Vuol dire che la query puoi scriverla:

    così:
    String query = "select * from impiegato where Nome=?";
    o così:
    String query = "SELECT * FROM impiegato WHERE nome=?";
    o così:
    String query = "select * from IMPIEGATO where NOME=?";
    ecc..

    e di per sé non cambia nulla. Ma la ricerca con = è generalmente case-sensitive (però bisogna vedere le impostazioni specifiche di db e/o tabella). Ovvero se nella tabella hai un impiegato con nome Luca (L maiuscola) e tu da java passi "luca", l'impiegato NON lo trovi.

    indisparte ha scritto:


    sono ad un passo dalla vittoria
    La implementazione di getImpiegatoByNome non è comunque completa/appropriata (non hai nemmeno chiuso ResultSet e PreparedStatement).


    EDIT: ah .. e quando si fa un select * (con asterisco), MAI prendere le colonne per il numero es. result.getString(3) !!!
  • Re: Relazione presente nel db ma non trovata da java

    Ecco l'errore:
    Connessione Riuscita
    Cerchiamo un impiegato:
    Nome:
    antonio
    org.postgresql.util.PSQLException: ERRORE: la relazione "impiegato" non esiste
    Posizione: 15
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2578)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2313)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:331)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:448)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:369)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:159)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:109)
    at giochiamoConDatabase.ImpiegatoDAO.getImpiegatoByNome(ImpiegatoDAO.java:37)
    at giochiamoConDatabase.Driver.<init>(Driver.java:40)
    at giochiamoConDatabase.Driver.main(Driver.java:18)

    Riguardo ai doppi apici mi riferisco a quelli usati in PostgreSQl, usando pgadmin per interagire con il db, quando creo la tabella vedo che nel codice SQL generato automaticamente mi crea :
    CREATE TABLE "Nomeschema"."Impiegato"
    A questi doppi apici mi riferisco.
  • Re: Relazione presente nel db ma non trovata da java

    indisparte ha scritto:


    Riguardo ai doppi apici mi riferisco a quelli usati in PostgreSQl, usando pgadmin per interagire con il db, quando creo la tabella vedo che nel codice SQL generato automaticamente mi crea :
    CREATE TABLE "Nomeschema"."Impiegato"
    A questi doppi apici mi riferisco.
    Ah sì ok. Nei vari DBMS c'è la possibilità di "quotare" gli identificatori (nomi di tabelle, colonne ecc..). Il carattere specifico per la quotatura cambia da db a db. Su PostgreSQL si usa " " mentre ad esempio su MySQL si usano i back-tick ` ` . Ma il punto è che quotando il nome, viene trattato case SENSITIVE.

    Quindi se hai fatto il CREATE TABLE specificando "Impiegato", poi nella query DEVI mettere di nuovo "Impiegato" quotato così, altrimenti non lo trova.

    P.S: nella risposta precedente ho aggiunto un EDIT, leggilo se non l'hai visto.
  • Re: Relazione presente nel db ma non trovata da java

    Ok allora, in java dovrei indicare nella query "Impiegato" compresi i doppi apici?
    Riguardo poi il tuo EDIT, cosa faccio, rimuovo gli indici o indico nella query cosa selezionare?
  • Re: Relazione presente nel db ma non trovata da java

    indisparte ha scritto:


    Ok allora, in java dovrei indicare nella query "Impiegato" compresi i doppi apici?
    Se non puoi/vuoi ricreare la tabella senza la quotatura del nome, sì:
    String query = "select * from \"Impiegato\" where Nome=?";
    Se nella create table anche le colonne sono state quotate ... idem.

    Altrimenti ricrei la tabella senza le quotature (dovresti comunque scrivere e tenerti un file SQL di "setup" della base dati).

    indisparte ha scritto:


    Riguardo poi il tuo EDIT, cosa faccio, rimuovo gli indici o indico nella query cosa selezionare?
    C'è una questione di fondo che forse non ti è (ancora) chiara: se fai select *, l'ordine in cui ti arrivano le colonne dipende dall'ordine FISICO con cui sono state definite le colonne. Ora, magari non è la tua situazione molto semplificata ma in contesti molto più "ampi" è tipico avere diversi ambienti, es. "dev", "test" "produzione" (e magari altro in mezzo). Magari uno sviluppatore ad un certo momento vuole aggiungere una colonna X in una tabella e nell'ambiente "dev" può sicuramente benissimo ricreare tutta la tabella per inserire la colonna X all'inizio o in mezzo come gradisce. Ma in un ambiente di "produzione" NON ricrea di certo tutta la tabella, fa sicuramente un alter table per aggiungere la colonna (che finisce al fondo).
    L'ordine fisico quindi potrebbe variare tra i vari ambienti. Questo non dovrebbe generalmente inficiare sulle query, se fatte appropriatamente.
    Se fai select * dipendi da quell'ordine e se prendi le colonne per indice .... è il modo per piantare macelli in situazioni come quella descritta di più ambienti.

    Pertanto, se fai select * dovresti prendere le colonne per nome es. result.getString("Nome")
    Altrimenti specifichi esattamente le colonne che vuoi:

    select nome, xyz, zyx, .... from ....
    E allora PUOI usare gli indici perché hai imposto tu un ordine ben preciso.
  • Re: Relazione presente nel db ma non trovata da java

    Ti ringrazio tantissimo per questo successo delle 11:42. Ho risolto aggiungendo gli apici e il nome dello schema. Seguirò il tuo consiglio
Devi accedere o registrarti per scrivere nel forum
6 risposte