Java 并非所有使用JDBC模板的变量绑定异常

Java 并非所有使用JDBC模板的变量绑定异常,java,jdbctemplate,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.MapSqlParameterSo

我正在使用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;
    }
}
此行列出员工=queryForListquery;抛出和异常

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;
    }
}
另外我还想知道,执行查询后返回的结果可以直接绑定到POJO中

简单地说,我的查询将返回有限数量的列,如10、13、15、50、90等

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

我想直接在域中绑定结果


因此,在研发之后,我提出了这个解决方案,在测试过程中遇到了这个问题,请向我推荐最佳解决方案。

除了Tim的答案之外,我想补充一点,您的代码没有将param变量放入查询中。您必须以某种方式将param map放入查询中。如果我们讨论的是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
);

您有param.addValueempCode,但SQL查询中的实际参数名为:EMP_CODE。解决这个问题,也许错误会消失。天哪,我怎么会错过这个,非常感谢Tim,你能给我关于我的要求的最好建议吗,请在我的代码之后仔细阅读问题描述。我对JDBCTemplate不太了解,无法对你问题的第二部分发表评论。通常,如果您的结果集中需要几十列,那么请准备好在JDBC端进行一些工作。如果你想要真正的自动映射,那么考虑使用像Hibernate /JPA这样的东西,它可以自动将记录映射到java类实体。我同意提姆的观点,但是我正在研究实际的工业项目,我们使用JDCBCMASTE,Project是稳定的和复杂的,所以在ORM上移动不是一件容易的事。是的,我们肯定会计划在接下来的项目中实现同样的功能。在我的脑海中,你可以编写一个模板来获取给定表中的每一列。然后,只需在整个代码中重用它,并且只在映射中访问那些您真正想要使用的键列。显然,从延迟的角度来看,这种方法是浪费时间的,因为您总是选择每一列。但是,它确实解决了为每个查询编写新映射程序的问题。