Spring Table Return 类型的 simplejdbc 和 Postgresql 函数

Spring simplejdbc and Postgresql Function with Table Return type

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

我有一个 return 是 TABLE 类型的 postgressql 函数。作为一个独立的函数 returns 基于输入的记录数。

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

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 class 中,我使用 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);

这导致在执行 returns 映射时出现 ClassCastException。

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

注意:我使用 return 游标的 Oracle 存储过程完成了类似的实现。不确定如何使它与 PostgreSQL 函数一起使用。我是初学者 对于 PostgreSQL。

我使用了一种稍微不同的方法来获取结果,而不是简单的 jdbccall

我。在函数上使用 jdbcTemplate.query 并编写 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;
                             }
                         });