Java 带多个参数的JBDCTemplate过程

Java 带多个参数的JBDCTemplate过程,java,mysql,spring,jdbc,spring-jdbc,Java,Mysql,Spring,Jdbc,Spring Jdbc,事情是这样的。。。我无法用下面的代码传递下面的语句“this”从未打印,因此结果集为0,但查询似乎正确 查询: 从title=1和(zipcode=11738或zipcode=11720或zipcode=11727或zipcode=11741或zipcode=11742或zipcode=11755或zipcode=11763或zipcode=11776或zipcode=11779或zipcode=11784或zipcode=11953)的Opportunity中选择* 上面的查询不会返回结果*

事情是这样的。。。我无法用下面的代码传递下面的语句“this”从未打印,因此结果集为0,但查询似乎正确

查询:

从title=1和(zipcode=11738或zipcode=11720或zipcode=11727或zipcode=11741或zipcode=11742或zipcode=11755或zipcode=11763或zipcode=11776或zipcode=11779或zipcode=11784或zipcode=11953)的Opportunity中选择*


上面的查询不会返回结果***

代码(刚刚切换了标题和zipcode位置,运行代码时仍将返回0个结果)

public Opportunity[]getOpportunities by(字符串标题、字符串zipcode、双英里){
title=“”+常量.TITLES_MAP.get(title.toLowerCase());
字符串[]nearbyZipcodes=getZipcodesWithinRadius(zipcode,miles);
StringBuilder=新的StringBuilder();
附加(((zipcode=“+zipcode+”或zipcode=“);
for(字符串其他ZIP:nearbyZipcodes){
附加(其他Zips+”或zipcode=“);
}
字符串formattedZips=Utilities.replaceLast(builder.toString(),“或zipcode=“,”);
System.out.println(title+“,”+格式化Zips);
List opportunities=this.jdbcTemplate.query(“从opportunities where?和title=?”中选择*”,
新对象[]{formattedZips,title},新的行映射器(){
public Opportunity mapRow(结果集rs,int rowNum)引发SQLException{
Opportunity temp=新Opportunity();
System.out.println(“本”);
字符串[]candidateId=rs.getString(“candidateId”).split(“,”);
临时设置CandidateId(实用程序StringToInArray(CandidateId));
临时设置公司(rs.getString(“公司”);
临时设置id(rs.getLong(“id”));
temp.setHtml(rs.getString(“post_数据”);
临时设置zipcode(rs.getString(“zipcode”);
临时设置标题(rs.getInt(“标题”);
试一试{
临时setLogoImg(新URI(rs.getString(“logo_img”));
}捕获(例外e){
}
返回温度;
}
});
return opportunities.toArray(新Opportunity[opportunities.size()]);
}
初始println的输出(title+“,”+formattedZips)

1,(zipcode=11738或zipcode=11720或zipcode=11727或zipcode=11741或zipcode=11742或zipcode=11755或zipcode=11763或zipcode=11776或zipcode=11779或zipcode=11784或zipcode=11953)


您的设置有两个问题

首先,您不应该使用连接来创建(部分)查询,其次,这不是参数化查询的工作方式。参数在放入之前会被转义,因此我怀疑查询是否符合您的预期

SQL使用
in
子句而不是执行
zipcode或zipcode或zipcode
)在查询中使用单个
in
子句。但是,当您希望传入数组时,您又遇到了一个问题。要修复此问题,请使用一个而不是普通的
jdbc模板
。然后重写查询以使用命名参数和子句中的

public Opportunity[] getOpportunitiesBy(String title, String zipcode, double miles) {
   String sql = "select * from opportunities where title = :title and zipcode in (:zips)";
   title = ""+Constants.TITLES_MAP.get(title.toLowerCase());
   String[] nearbyZipcodes = getZipcodesWithinRadius(zipcode, miles);

   Map<String, Object> params = new HashMap<>();
   params.put("title", nearbyZipcodes);
   params.put("zips", near)

   return this.jdbcTemplate.query(sql, params, new RowMapper<Opportunity>() {
       public Opportunity mapRow(ResultSet rs, int rowNum) throws SQLException {
           Opportunity temp = new Opportunity();
           System.out.println("this");
           String[] candidateIds = rs.getString("candidateIds").split(",");
           temp.setCandidateIds(Utilities.StringToIntArray(candidateIds));
           temp.setCompany(rs.getString("company"));
           temp.setId(rs.getLong("id"));
           temp.setHtml(rs.getString("post_data"));
           temp.setZipcode(rs.getString("zipcode"));
           temp.setTitle(rs.getInt("title"));
           try {
               temp.setLogoImg(new URI(rs.getString("logo_img")));
           } catch (Exception e) {
           }
           return temp;
       });

}
public Opportunity[]getOpportunities by(字符串标题、字符串zipcode、双英里){
String sql=“从Opportunity中选择*,其中title=:title和zipcode in(:zips)”;
title=“”+常量.TITLES_MAP.get(title.toLowerCase());
字符串[]nearbyZipcodes=getZipcodesWithinRadius(zipcode,miles);
Map params=新的HashMap();
参数put(“标题”,靠近Zipcode);
参数放置(“拉链”,近)
返回此.jdbcTemplate.query(sql、参数、新的行映射器(){
public Opportunity mapRow(结果集rs,int rowNum)引发SQLException{
Opportunity temp=新Opportunity();
System.out.println(“本”);
字符串[]candidateId=rs.getString(“candidateId”).split(“,”);
临时设置CandidateId(实用程序StringToInArray(CandidateId));
临时设置公司(rs.getString(“公司”);
临时设置id(rs.getLong(“id”));
temp.setHtml(rs.getString(“post_数据”);
临时设置zipcode(rs.getString(“zipcode”);
临时设置标题(rs.getInt(“标题”);
试一试{
临时setLogoImg(新URI(rs.getString(“logo_img”));
}捕获(例外e){
}
返回温度;
});
}
类似的东西应该可以做到这一点,但是如果您的
getZipCodesWithinRadius
也使用一个查询,您甚至可以在in子句中使用该查询作为子选择,只需传入给定的
zipcode
miles
,这样您就可以一次查询得到结果(而不是2个查询和所有与之相关的jdbc内容)

public Opportunity[] getOpportunitiesBy(String title, String zipcode, double miles) {
   String sql = "select * from opportunities where title = :title and zipcode in (:zips)";
   title = ""+Constants.TITLES_MAP.get(title.toLowerCase());
   String[] nearbyZipcodes = getZipcodesWithinRadius(zipcode, miles);

   Map<String, Object> params = new HashMap<>();
   params.put("title", nearbyZipcodes);
   params.put("zips", near)

   return this.jdbcTemplate.query(sql, params, new RowMapper<Opportunity>() {
       public Opportunity mapRow(ResultSet rs, int rowNum) throws SQLException {
           Opportunity temp = new Opportunity();
           System.out.println("this");
           String[] candidateIds = rs.getString("candidateIds").split(",");
           temp.setCandidateIds(Utilities.StringToIntArray(candidateIds));
           temp.setCompany(rs.getString("company"));
           temp.setId(rs.getLong("id"));
           temp.setHtml(rs.getString("post_data"));
           temp.setZipcode(rs.getString("zipcode"));
           temp.setTitle(rs.getInt("title"));
           try {
               temp.setLogoImg(new URI(rs.getString("logo_img")));
           } catch (Exception e) {
           }
           return temp;
       });

}