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;
}
});
我正在使用带有 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;
}
});