首页 > 解决方案 > 具有表返回类型的 Spring simplejdbc 和 Postgresql 函数

问题描述

我正在使用带有 Spring JDBC 模板的 PostgreSQL。

我有一个返回 TABLE 类型的 postgressql 函数。作为独立的函数,该函数根据输入返回记录数。

表函数如下所示(不是确切的实现,而是一个示例)

CREATE OR REPLACE FUNCTION 
search( p_query varchar(20))
RETURNS table (name varchar(20),
 address varchar(100),
salary numeric) 
               
AS $$ 

select name,
address,
salary 
from emp_table
where
upper(name) = upper(p_query);

$$LANGUAGE 'sql';

在 DAO 类中,我使用 simplejdbccall 来执行函数。

Map<String, Object> results =  simpleJdbcCall.withSchemaName(DB_SCHEMA_NAME)
                    .withFunctionName(SEARCH_FUNCTION)
                    .execute(INPUT_PARAMETERS);

没有错误。但是结果只有一条记录(第一条记录)。

所以我尝试了,

List<Map<String, Object>> results = (List<Map<String, Object>>) simpleJdbcCall.withSchemaName(DB_SCHEMA_NAME)
                    .withFunctionName(SEARCH_FUNCTION)
                    .execute(INPUT_PARAMETERS);

这导致 ClassCastException 因为执行返回一个 Map。

java - 如何使用spring jdbctemplate而不是Java中的直接插入查询来调用PostgreSQL函数?

上述解决方案适用于单个返回值,但不适用于表类型。不使用 Hibernate JPA 是否可以实现这个用例。

注意:我使用返回游标的 Oracle 存储过程完成了类似的实现。不知道如何使它与 PostgreSQL 函数一起工作。我是 PostgreSQL 的初学者。

标签: postgresqlspring-jdbc

解决方案


我没有使用 simplejdbccall,而是使用了稍微不同的方法来获得结果

一世。使用 jdbcTemplate.query 并在 Function ii 上编写 select 语句。使用 Rowmapper 将结果映射到 Bean。

下面的例子。

List<TableObjectBean> outputList = jdbcTemplate.query("select name,address,salary from search(?)"
                         ,new Object[] {queryParam}
                         ,new RowMapper<TableObjectBean>() {
                             @Nullable
                             @Override
                             public TableObjectBean mapRow(ResultSet resultSet, int i) throws SQLException {
                                 TableObjectBean tableObjectBean = new TableObjectBean();
                                 tableObjectBean.setName(resultSet.getString(1));
                                 tableObjectBean.setAddress(resultSet.getString(2));
                                 tableObjectBean.setSalary(resultSet.getDouble(3));
                                 return tableObjectBean;
                             }
                         });

推荐阅读