如何更改结果集或列表中值的类型?

vptzau2j  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(267)

我有一个sql过程,我在groovy(java)中用我想要的参数访问它,然后返回游标。在resultset的帮助下,我将数据作为数据集返回。但我面临一个问题。表中的字段有3种类型:数字、字符串和日期。当我已经在groovy(java)中工作时,numeric被识别为一个带点的数字,因此我得到的数字末尾带有“.0”,尽管数据库中的记录是正常的(没有“.0”)。例如,在数据库中字段是“10”,但在groovy(java)中运行时得到“10.0”。

OutParameter CUR_SERVICE = new OutParameter() {
                public int getType() {
                    return OracleTypes.CURSOR;
                }
            }

            try {
                sql.call("{call test.test (a => ?, b => ?, c => ?, pcur => ?)}"
                        , [a,
                           b,
                           c,
                           CUR_SERVICE
                ]) {
                    ResultSet row_service -> reader.readResultSet(row_service)

                }
}

我也尝试了第二种选择。我将数据放在“list”中,它是这样工作的,但是在本例中,要以数据集的形式返回它,我必须形成“names”、“types”,然后只传递值​​其类型必须与“类型”对应。因此,已经存在两个问题:
bigdecimal(同一点)
时间戳(对于日期字段)

OutParameter CUR_SERVICE = new OutParameter() {
                public int getType() {
                    return OracleTypes.CURSOR;
                }
            }

            try {
                sql.call("{call test.test (a => ?, b => ?, c => ?, pcur => ?)}"
                        , [a,
                           b,
                           c,
                           CUR_SERVICE
                ]) {
                    ResultSet row_service -> //reader.readResultSet(row_service)

                        ResultSetMetaData md = row_service.getMetaData();
                        int columns = md.getColumnCount();
                        ArrayList list = new ArrayList();
                        while (row_service.next()){
                            HashMap row = new HashMap(columns);
                            for(int i=1; i<=columns; ++i){
                                row.put(md.getColumnName(i),row_service.getObject(i));
                                def aabbcc = md.getColumnName(i)
                                aabbcc
                            }
                            list.add(row);
                        }

                        List names = list.inject(new LinkedHashSet<>()) { res, map ->
                            res.addAll map.keySet()
                            res
                        }.toList()

                        def typeMap = [:].withDefault { key -> "String" }
                        list.each { map ->
                            map.each { key, values ->
                                if (values != null) {
                                    typeMap[key] = values.getClass().simpleName
                                }
                            }
                        }

                        def types = names.collect { name -> typeMap[name] }

                        println(types)

                        reader.outputLinesSetHeaders(names, types)

                        list.each { e ->
                            reader.outputLines names.collect { e[it] }
                        }

                        reader.outputLinesEnd();
                        return null;

                }
}

我需要的是:
将类型从“bigdecimal”更改为“integer”,这样就可以正常读取“types”和值​​不包含“.0”
将类型从“timestamp”更改为“string”,以便可以正常读取“types”和值​​是“11/19/2020 00:00”,但不是11/19/2020 00:00(不是字符串)。我该怎么做?或者,在第一种情况下,如何在不更改类型的情况下删除“.0”?

cidc1ykv

cidc1ykv1#

有几种方法可以做到这一点。对于(1),您可以从整数中创建值,如下所示:

BigDecimal x = new BigDecimal(55);
    Integer y = new Integer(3);

    y = new Integer(x.intValue());

for(2)mytimestamp.tostring()返回可以解析的字符串。

相关问题