【问题标题】:How to read an array of dates Date[] from a ResultSet for use with java.time classes?如何从 ResultSet 中读取日期数组 Date[] 以用于 java.time 类?
【发布时间】:2021-06-06 06:49:51
【问题描述】:

Screenshot from Eclipse.

我正在尝试从我的 ResultSet 变量中读取一个属性,该属性是一个日期数组 Date [],但我无法使用任何可用函数来执行此操作。任何人都可以帮助我吗?谢谢你。 读取日期数组的 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,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()

在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

【问题讨论】:

  • periodo_carica 中真的有一个 SQL 时间戳数组吗?你能附加几行查询的输出吗?
  • 如果可以,你不能用getArray("periodo_carica")这个方法吗?
  • 我尝试了 getArray 和 getDate
  • 你能从查询中获取 1 或 2 行输出吗? periodo_carica 是一个日期范围数组 .. 可能的日期范围根本不映射 See Postgresql JDBC Arrays ..
  • 在最底端,在代码之后,我添加了查询输出的截图

标签: arrays date resultset java-time getdate


【解决方案1】:

如果您无法使您的 JDBC 库与 PG 的 daterange 类型一起使用,也许您可​​以重新编写查询以将 daterange DB objs 转换为字符串(因此是一个 ARRAY 但类型为字符串)或只是一个组合字符串 - 请参阅 pg array_to_string fn - 在这种情况下,您将在 Java 领域处理结果字符串。

【讨论】:

  • vladmihalcea.com/map-postgresql-range-column-type-jpa-hibernate 在这里我找到了一个实现,但是当我导入 import hibernate-types-master.hibernate-types-4.src.main.java.com.type.range.Range;它给了我一个错误:此行有多个标记 - 标记上的语法错误,删除这些标记 - 无法解析导入休眠 - 标记上的语法错误,删除这些标记
  • 如果您查看查询输出 - 看到它是 {[RANGELOW,RANGEHIGH]} - 所以它是一个日期范围数组 - 代码 sn-p 用于处理单个日期范围而不是日期范围数组 - 所以你我需要做类似的事情结合分解数组..如果我查看您的样本,数组中只有一个元素-您可以直接抓住它吗-SELECT periodo_carica[1] 给您一个日期范围而不是一个日期范围数组?
  • 我想我是这样解决的: if(rs.getArray("periodo_carica") == null) periodo_carica = null; else if(rs.getObject("periodo_carica")==java.time.LocalDate[].class) periodo_carica=(LocalDate[]) rs.getObject("periodo_carica");
  • 你不是想得到一个 DateRange 吗?如果它有效,您仍然需要获取成对的日期并设置范围......
猜你喜欢
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2013-03-26
相关资源
最近更新 更多