java - 使用 JDBC 模板并非所有变量绑定(bind)异常

标签 java jdbctemplate

我正在使用jbcTemplate,遇到ORA-01008异常。

package com.awzpact.prayas.service;

import com.awzpact.uam.dao.BaseJdbcTemplate;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.stereotype.Service;

/**
 *
 * @author zia.khan
 */
@Service
public class PayCodeDetailListService extends BaseJdbcTemplate {

    public List<Map<String, Object>> searchPayCodeByempCode(String tabSuffix, String empCode, String yyyyMm) {
        MapSqlParameterSource param = new MapSqlParameterSource();
        String tableName = "Salary_detail_report_082018";
        String query = "SELECT "
                + " DISTINCT PAY_CODE, "
                + " PAY_CODE_DESC, "
                + " AMOUNT, "
                + " row_number() over (Order by EMP_CODE ) AS ROW_NUM "
                + " FROM " + tableName
                + " WHERE EMP_CODE=:EMP_CODE "
                + " AND YYYYMM=:YYYYMM "
                + " AND PAY_CODE NOT IN (997,998,999) "
                + " ORDER BY PAY_CODE ASC ";
        param.addValue("empCode", empCode);
        param.addValue("YYYYMM", yyyyMm);
        List<Map<String, Object>> employees = queryForList(query);
        if (employees != null && !employees.isEmpty()) {
            for (Map<String, Object> employee : employees) {
                for (Iterator<Map.Entry<String, Object>> it = employee.entrySet().iterator(); it.hasNext();) {
                    Map.Entry<String, Object> entry = it.next();
                    String key = entry.getKey();
                    Object value = entry.getValue();
                    System.out.println(key + " = " + value);
                }
            }
        }
        return employees;
    }
}

这一行List<Map<String, Object>> employees = queryForList(query);抛出和异常。

另外我还想知道,执行查询后返回的结果可以直接绑定(bind)到POJO中吗?

简单的意思,我的查询将返回有限数量的列,例如 10,13,15 50,90 等。

现在我不想实现映射器,因为有 95 条记录,对于有限的记录,我需要编写大映射器,并且每次在映射行时还需要检查空值。

我想直接将结果绑定(bind)到域中。

所以在研发之后我想出了这个解决方案,在测试时我遇到了这个问题,请建议我最好的解决方案。

最佳答案

除了蒂姆的回答之外,我想补充一点,您的代码不会将 param 变量放入查询中。您必须以某种方式将 param 映射放入查询中。如果我们谈论 Spring JdbcTemplate 类,它有大量不同的方法,例如你可以这样做:

jdbcTemplate.query(
    "select id from your_table_here where first_column = ? and second_column = ?",
    new Object[] {
        firstParameter, secondParameter
    },
    new int[] {
        VARCHAR, VARCHAR // types of parameters in same order
    },
    new SingleColumnRowMapper<>()   // here you can use your own mapper
);

关于java - 使用 JDBC 模板并非所有变量绑定(bind)异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52738099/

相关文章:

java.security.NoSuchAlgorithmException : Algorithm x25519 not available

java - 将 XMP 写入多页 TIFF 的库

c# - 将页面呈现为图片

java - 按文件夹模式搜索文件

java - MySql JDBC 模板上的 StatementCallback 错误

java - 如何在jdbctemplate中为两个oracle不同数据源创建单个事务管理器

java - 不使用命名参数时重用 sql 参数

java - 延迟初始化集合

mysql - 使用 DriverManagerDataSource bean 设置 noAccessToProcedureBodies

spring-boot - 如何使用默认的 Tomcat 连接池在 Spring Boot 1.3.x 中的 DataSource 上设置自定义连接属性