Search code examples
arraysdateresultsetjava-timegetdate

How to read an array of dates Date[] from a ResultSet for use with java.time classes?


Screenshot from Eclipse.

I'm trying to read from my ResultSet variable an attribute which is an array of dates Date [], but I can't do it with any of the available functions. Could anyone kindly help me? Thank you. a ResultSet function that reads an array of Dates does not exist, so since I had a daterange [] in postgresql, I replaced it with LocalDate []. I found a file on GitHub that implements the range, but the import doesn't work for me.

public static ArrayList<Parlamentare> elenco_Parlamentari()throws 
NullPointerException{
     
    String url = "jdbc:postgresql://localhost/Parlamento"; //cambia mydb
    String user = "postgres";
    String password = "";
    ArrayList<Parlamentare> elenco = new ArrayList<Parlamentare>();
    
    Range r;
    Statement st;
    ResultSet rs;
    String sql; 
    
    try(Connection cn = DriverManager.getConnection(url, user, password);) 
    {
           if(cn != null) {
               System.out.println("Connected to PostgreSQL server 
    successfully!");
           }else {
               System.out.println("Failed to connect PostgreSQL server");
           }
           
          
    sql = "SELECT 
    nome,partito,circoscrizione,data_nascita,luogo,titolo_studi,
    mandati,commissioni,periodo_carica FROM parlamentari;";
    
        st = cn.createStatement(); // creo sempre uno statement sulla
                                    // connessione
        
        String nome = "";
        String partito = "";
        String circoscrizione = "";  
        Date data_nascita = null;
        String luogo = null;
        String titolo_studi = "";
        String[] mandati = null;
        String[] commissioni = null; 
        LocalDate[] periodo_carica = null;
       // LocalDate localDate = null;
        
        rs = st.executeQuery(sql); // faccio la query su uno statement
        while (rs.next() == true) {
            
            try {
            Parlamentare a=new Parlamentare();
            nome = rs.getString("nome");
            partito = rs.getString("partito");
            circoscrizione = rs.getString("circoscrizione");  
            data_nascita = rs.getDate("data_nascita");
            luogo = rs.getString("luogo");
            titolo_studi = rs.getString("titolo_studi");
            
            if(rs.getArray("mandati") == null)
               mandati=null;
            else  mandati=rs.getArray("mandati").toString().split(",");
            
            if(rs.getArray("commissioni") == null)
                   commissioni=null;
                else  
           commissioni=rs.getArray("commissioni").toString().split(",");
            rs.getObject("periodo_carica").getClass();
           // LocalDate localDate =
                    rs.getObject(1, LocalDate.class);
        //  case "daterange":
            //  return Range.localDateRange(value);
            rs.getType()==
            if(rs.getArray("periodo_carica") == null)
                periodo_carica = null;
                else  periodo_carica = 
        rs.getObject("periodo_carica").getClass();
                        //rs.getArray("periodo_carica").toString();
                    //  getDate();
            //          getObject("periodo_carica").;
                    /// toString().;// toString().split(",");
            // .getDate("periodo_carica");//.toString().split(",");
            
            


    System.out.print("rs.getObject(\"periodo_carica\").getClass()="+
     rs.getObject("periodo_carica").getClass());
            //rs.getObject(...).getClass()
         
            a = new 
   Parlamentare(nome,partito,circoscrizione,data_nascita,
   luogo,titolo_studi,
   mandati,commissioni,periodo_carica);
            elenco.add(a);  
            }
            catch(NullPointerException obj) {
                obj.printStackTrace();
          }            
            
        }           
        
        cn.close(); // chiusura connessione
    } catch (SQLException e) {
        System.out.println("errore:" + e.getMessage());
           e.printStackTrace();
       }    

    return elenco;
    } //end  elenco_Parlamentari()

in postgresql:

CREATE TABLE public.parlamentari (
     nome character varying(100) COLLATE pg_catalog."default" NOT NULL,
     partito character varying(100) COLLATE pg_catalog."default" NOT NULL,
     circoscrizione character varying(100) COLLATE pg_catalog."default" 
     NOT NULL,
     data_nascita date,
     luogo character varying(100) COLLATE pg_catalog."default",
     titolo_studi character varying(100) COLLATE pg_catalog."default",
     mandati character varying(1000)[] COLLATE pg_catalog."default",
     commissioni character varying(100)[] COLLATE pg_catalog."default",
     periodo_carica daterange[],
     CONSTRAINT parlamentari_pkey PRIMARY KEY (nome, partito, 
     circoscrizione),
     CONSTRAINT parlamentarinomekey UNIQUE (nome),
     CONSTRAINT parlamentaripartitonomekey UNIQUE (partito, nome)
     )

TABLESPACE pg_default;

ALTER TABLE public.parlamentari
OWNER to postgres;

GRANT ALL ON TABLE public.parlamentari TO postgres;

GRANT ALL ON TABLE public.parlamentari TO PUBLIC;

Parlamentare.java

      public Parlamentare() {
           String nome = "";
           String partito = "";
           String circoscrizione = "";  
           Date data_nascita = null;
           String luogo = null;
           String titolo_studi = "";
           String[] mandati = null;
           String[] commissioni = null; 
           LocalDate[] periodo_carica = null;
           }

Sample Query Output


Solution

  • In the event you can't make your JDBC library work with the daterange type from PG, perhaps you can re-write the query to convert the daterange DB objs into strings (so an ARRAY but of type string) OR just a combined string - see pg array_to_string fn - in which case you process the resultant string in Java land.