如何使用自定义类型参数形式java调用PostgreSQL存储过程

时间:2015-03-29 17:02:04

标签: java postgresql

我有一个PostgreSQL自定义类型:

CREATE TYPE seg_type AS
(
    _timestamp bigint,
    segment_type bigint,
    area_type bigint,
);

我有一个java类:

public class Segment
{
    private Long ts;
    private Long seg_type;
    private Long area_type;
}

另外我有一个存储过程:

CREATE OR REPLACE FUNCTION SomeFunc(seg_type[])

我正在使用 postgresql-9.3-1102.jdbc41.jar 连接到我的数据库。我希望能够使用Segment []从java代码中调用我的存储过程,如下所示:

String query = new String("{call SomeFunc(?)}");
CallableStatement stmt = dbConn.prepareCall(query);
stmt.setObject(1, Segment[], Type);

如果这是正确的实现,那么我应该在Type中添加什么? 或者实施可能不正确?

1 个答案:

答案 0 :(得分:2)

可能的解决方案如下:

java Segment类中创建一个函数,该函数以postgreSQL类型的格式创建一个字符串。

public class Segment
{
   private Long ts;
   private Long seg_type;
   private Long area_type;

   public pgType(){
      return String.format("\"(%d,%d,%d)\"",
         this.ts, this.seg_type, this.area_type)
   }
}

注意:对于不同的数据类型,您可能需要以不同的方式格式化字符串。

这将返回以下字符串"(ts, seg_type, area_type)",表示postgres中的seg_type类型。

现在,您需要通过Segment[]数组来形成postgres array

StringBuilder segTypeArray = new StringBuilder("{");
segTypeArray.append(segments.[0].getDBValue());  
for(int i = 1; i < segments.length; i++){
   segTypeArray.append("," + list.get(i).getDBValue());
}
segTypeArray.append("}");

这将创建postgres array seg_type类型 {"(ts, seg_type, area_type)","(ts, seg_type, area_type)",.....}

创建查询字符串时,请确保转换为seg_type []

String query = new String("{call SomeFunc(?::seg_type[])}");
CallableStatement stmt = dbConn.prepareCall(query);
stmt.setObject(1, segTypeArray.toString());