postgresql - 具有表返回类型的 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 的初学者。
解决方案
我没有使用 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;
}
});
推荐阅读
- azure - Azure KeyVault 和 Scala 2.11 和 Spark 2.4.4
- chisel - 如何使用两个管理器将客户端连接到 IdentityNode?
- javascript - 如何在 react-id-swiper 中正确居中和对齐图像
- python - 熊猫评分系统;显示关系为“3-4”
- python - 构建函数以可视化 Alphafold2 预测的麻烦
- c - 在 C 中打印 char* 时,仅打印第一个字符
- abp - abp io AbpDataFilterOptions
- satellite-image - 为什么有些 Sentinel-2 场景遵循 SAFE 格式,而有些则不遵循?
- spring-boot - 在 Kafka Joins 中丢失一些事件
- sql-server - 如何解决 Azure SQL 数据库性能问题?