如何从 ResultSet 中读取日期数组 Date[] 以与 java.time 类一起使用?

问题描述

Screenshot from Eclipse

我试图从我的 ResultSet 变量中读取一个属性,它是一个日期数组 [],但我无法使用任何可用函数来完成它。任何人都可以帮助我吗?谢谢你。 读取日期数组的 ResultSet 函数不存在,因此由于我在 postgresql 中有一个 daterange [],我将其替换为 LocalDate []。我在 GitHub 上找到了一个实现范围的文件,但导入对我不起作用。

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,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()

在 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,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

解决方法

如果你不能让你的 JDBC 库使用来自 PG 的 daterange 类型,也许你可以重新编写查询以将 daterange DB objs 转换为字符串(所以一个 ARRAY 但类型为 string ) 或只是一个组合字符串 - 请参阅 pg array_to_string fn - 在这种情况下,您可以在 Java 中处理结果字符串。