Java JdbcTemplate返回空列表

Java JdbcTemplate返回空列表,java,spring,jdbctemplate,Java,Spring,Jdbctemplate,JdbcTemplate在执行“query”方法时返回一个空列表 public List getLoanDAO(Employee-Employee,字符串s){ 最后一个字符串SQL=“选择CTLPCODCIA、CTLPCODSUC、CTLPCODTRA、EMPNOMBRE、EMPAPATERN、EMPAMATERN、CTLPCODPRE,” +CTLPIPPRE、TIPDESPRE、CTLPMONEDA、CTLPESTADO、CTLPMONTOP、CTLPROCUO、CTLPCUOTA、FLA

JdbcTemplate在执行“query”方法时返回一个空列表

public List getLoanDAO(Employee-Employee,字符串s){
最后一个字符串SQL=“选择CTLPCODCIA、CTLPCODSUC、CTLPCODTRA、EMPNOMBRE、EMPAPATERN、EMPAMATERN、CTLPCODPRE,”
+CTLPIPPRE、TIPDESPRE、CTLPMONEDA、CTLPESTADO、CTLPMONTOP、CTLPROCUO、CTLPCUOTA、FLAGTIPOCUOTA、CTGLOSA、CTLDIASFR、
+CTLDOCADJ,CTLUSCREA,CTLFECREA
+“从HR_CTLPREC_SS内部连接HR_EMPLEADO ON CTLPCODCIA=EMPCODCIA和CTLPCODSUC=EMPCODSUC和CTLPCODTRA=EMPCODTRA”
+“CTLPCODCIA=TIPCODCIA和CTLPCODSUC=TIPCODSUC和CTLPIPRE=TIPCODPRE上的内部联接HR_TIPPRE”
+“其中TIPFLGEST='1'和TIPSELFSERVICE='1'”
+“和CTLPCODCIA=?和CTLPCODSUC=?和EMPCODTRAJEF=?和CTLPESTADO=?”;
List loans=jdbcTemplate.query(SQL,新对象[]){
employee.getCTLPCODCIA(),employee.getCTLPCODSUC(),employee.getCTLPCODTRA(),s},loanMapper);
归还贷款;
}
但是,当使用在执行中使用的参数和在sqldeveloper中执行的参数替换“?”时,它返回4行。我不知道出了什么问题,因为我一直在以同样的方式为所有其他实体编写数据访问代码


问题解决 如@Julian所述:


JdbcTemplate是一个经过验证的spring组件,被大量应用程序使用,所以我认为它一定是代码中的一个bug

这不是JdbcTemplate的问题,我的代码也不是。这是IDE的一个问题。我只是使用maven控制台命令从头开始构建我的项目,代码按预期工作


谢谢大家。

JdbcTemplate是一个被大量应用程序使用的经验证的spring组件,所以我认为它一定是您代码中的一个bug。 不确定您使用的是哪一版本的Spring,但jdbcTemplate.query期望贷款映射器类作为其参数之一。您的代码中没有这样的映射程序

我建议您在查询之前放置一个断点,检查employee字段,看看它们是否与您在sqldeveloper中使用的值匹配


它吸引我注意的另一件事是第三件事,你有EMPCODTRAJEF=?但您使用employee.getCTLPCODTRA()作为参数。显然,我不知道您的数据模型,但它应该是employee.getEMPCODTRAJEF()还是相反?

如果这不起作用,请仔细检查您的参数

final String SQL = "SELECT CTLPCODCIA, CTLPCODSUC, CTLPCODTRA, EMPNOMBRE, EMPAPATERN, EMPAMATERN, CTLPCODPRE, "
            + "CTLPTIPPRE, TIPDESPRE, CTLPMONEDA, CTLPESTADO, CTLPMONTOP, CTLPNROCUO, CTLPCUOTA, FLAGTIPOCUOTA, CTLGLOSA, CTLDIASFR, "
            + "CTLDOCADJ, CTLUSUCREA, CTLFECCREA "
            + "FROM HR_CTLPREC_SS INNER JOIN HR_EMPLEADO ON CTLPCODCIA=EMPCODCIA AND CTLPCODSUC=EMPCODSUC AND CTLPCODTRA=EMPCODTRA "
            + "INNER JOIN HR_TIPPRE ON CTLPCODCIA=TIPCODCIA AND CTLPCODSUC=TIPCODSUC AND CTLPTIPPRE=TIPCODPRE "
            + "WHERE CTLPCODCIA=? AND CTLPCODSUC = ? AND EMPCODTRAJEF = ? AND CTLPESTADO = ? "
            + "AND TIPFLGEST='1' AND TIPSELFSERVICE='1'";
将其添加到
application.properties
以调试查询。
logging.level.org.springframework.jdbc.core=TRACE

尝试在
=
符号之间添加一个空格。“employee.getCTLPCODTRA()”可以。正如你所说,这是我的商业逻辑。我还使用IDE在调试器模式下运行代码,检查employee变量和“s”变量是否与我在sqldeveloper中使用的相同。我的“loanMapper”对象也是正确的。我只是不想在我的帖子上写太多代码。我知道“loanMapper”很好用,因为它被用在其他方法中。在“loanMapper”中添加记录器没有帮助,因为它的代码从未运行过。我想这只会让这个问题更难解决。如果所有参数都正确,那么我能看到的唯一解释是,您指向的是java中的模式/数据库,而不是sqldeveloper中的模式/数据库。我知道您在那里做了什么。将“=”与列名和“?”分开。我已经试过了,但没有得到任何结果仔细检查你的参数由于我缺乏知识,但是,你说的“仔细检查”是什么意思?确保Java中的参数与SQL中使用的参数匹配。我已经这样做了。我使用调试器在运行时检查它们。但它们是一样的。
final String SQL = "SELECT CTLPCODCIA, CTLPCODSUC, CTLPCODTRA, EMPNOMBRE, EMPAPATERN, EMPAMATERN, CTLPCODPRE, "
            + "CTLPTIPPRE, TIPDESPRE, CTLPMONEDA, CTLPESTADO, CTLPMONTOP, CTLPNROCUO, CTLPCUOTA, FLAGTIPOCUOTA, CTLGLOSA, CTLDIASFR, "
            + "CTLDOCADJ, CTLUSUCREA, CTLFECCREA "
            + "FROM HR_CTLPREC_SS INNER JOIN HR_EMPLEADO ON CTLPCODCIA=EMPCODCIA AND CTLPCODSUC=EMPCODSUC AND CTLPCODTRA=EMPCODTRA "
            + "INNER JOIN HR_TIPPRE ON CTLPCODCIA=TIPCODCIA AND CTLPCODSUC=TIPCODSUC AND CTLPTIPPRE=TIPCODPRE "
            + "WHERE CTLPCODCIA=? AND CTLPCODSUC = ? AND EMPCODTRAJEF = ? AND CTLPESTADO = ? "
            + "AND TIPFLGEST='1' AND TIPSELFSERVICE='1'";