如何在spring

时间:2017-08-01 00:46:48

标签: java spring postgresql jdbctemplate

我使用Java 7和JDBC模板从PostgreSQL查询整数数组。我的代码如下:

@Autowired
private JdbcTemplate jdbcTemp;

String SQL = "select item_list from public.items where item_id=1";
List<Integer> ListOfitems=jdbcTemp.queryForList(SQL , Integer.class);

我的item_list列在PostgreSQL中为integer[]。但是,当我尝试这样做时,它会抛出一个错误:

  

int psql异常类型的错误值

我也尝试过:

List<List<Integer>> ListOfitems=jdbcTemp.queryForList(SQL , Integer.class);

但它仍然会引发同样的异常。

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

要获取单行的数组字段,它应该是:

import java.sql.Array;

...

final String sqlQuery = "...";
final Array itemListArray = jdbcTemplate.queryForObject(sqlQuery, Array.class);

请注意,方法调用可能会抛出异常:

  

IncorrectResultSizeDataAccessException - 如果查询没有返回一行,或者没有返回该行中的一列

     

- JdbcTemplate (Spring Framework 4.3.10.RELEASE API) class, public <T> T queryForObject(String sql, Class<T> requiredType) throws DataAccessException method

答案 1 :(得分:1)

您可以使用java.sql.Array

如果你只想获得整数数组,你可以这样尝试(如果结果包含一行,它就有效):

String SQL = "select item_list from public.items where item_id=1";
Array l = template.queryForObject(SQL, Array.class);
List<Integer> list = Arrays.asList((Integer[]) l.getArray());

或使用RowMapper

Foo foo = template.queryForObject(SQL, new RowMapper<Foo>(){
        @Override
        public Foo mapRow(ResultSet rs, int rowNum) throws SQLException {
            Foo foo = new Foo();
            foo.setName(rs.getString("name"));
            foo.setIntegers(Arrays.asList((Integer[]) rs.getArray("item_list").getArray()));
            return foo;
        }
    });

Class Foo:

class Foo {
    private String name;
    private List<Integer> integers;

    public String getName() {
        return name;
    }
    // ...
}

答案 2 :(得分:0)

经过大量的反复试验后,这就成了伎俩。

List<Array>  ListOfitems=jdbcTemp.queryForList(SQL , java.sql.Array.class);

所以基本上postgres数组等于java sql数组类型。希望它可以帮助任何人:)