2016-07-01 15 views
1

JDBCTemplate query()を使用してレコードを取得しようとしていて、パラメータバインディングをMapとして渡そうとしています。 MySQLがArrayIndeOutOfBoundExceptionをスローしています。以下はスタックトレースです。ここでSpring JDBCTemplate MysqlスローインMysqlドライバのArrayIndxOutofBound

Exception in thread "main" org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [select * from customers where cid= :cid]; 

Invalid argument value: java.lang.ArrayIndexOutOfBoundsException; nested exception is java.sql.SQLException: Invalid argument value: 

java.lang.ArrayIndexOutOfBoundsException 
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:108) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:645) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:680) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:712) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:722) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:777) 
    at com.jlcnindia.spring.jdbc.JdbcCustomerDAO.getCustomerByCid(JdbcCustomerDAO.java:32) 
    at com.jlcnindia.spring.jdbc.Lab58.main(Lab58.java:14) 
Caused by: java.sql.SQLException: Invalid argument value: java.lang.ArrayIndexOutOfBoundsException 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:998) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:937) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:872) 
    at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:3887) 
    at com.mysql.jdbc.PreparedStatement.setObject(PreparedStatement.java:3603) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:428) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:235) 
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:166) 
    at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.doSetValue(ArgumentPreparedStatementSetter.java:66) 
    at org.springframework.jdbc.core.ArgumentPreparedStatementSetter.setValues(ArgumentPreparedStatementSetter.java:47) 
    at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:686) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629) 
    ... 6 more 
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0 
    at com.mysql.jdbc.PreparedStatement.setBinaryStream(PreparedStatement.java:2871) 
    at com.mysql.jdbc.PreparedStatement.setSerializableObject(PreparedStatement.java:3884) 
    ... 14 more 

は私のRowMapperのクラスには、クエリ

public CustomerTO getCustomerByCid(int cid) { 
    String sql="select * from customers where cid=:cid"; 

    Map<String,Object> parameters=new HashMap<String, Object>(); 
    parameters.put("cid", cid); 

    List<CustomerTO> list=jdbcTemp.query(sql, new CustomerRowMapper(),parameters); 
    if(null!=list && !list.isEmpty()) 
    return list.get(0); 
    return null; 
} 

CustomerTOクラス

package com.jlcnindia.spring.jdbc; 

public class CustomerTO { 
private int cid; 
private String cname; 
private String email; 
private long phone; 
private String city; 


public CustomerTO(){} 

public CustomerTO(String cname, String email, long phone, String city) { 
    super(); 
    this.cname = cname; 
    this.email = email; 
    this.phone = phone; 
    this.city = city; 
} 




public int getCid() { 
    return cid; 
} 


public void setCid(int cid) { 
    this.cid = cid; 
} 


public String getCname() { 
    return cname; 
} 


public void setCname(String cname) { 
    this.cname = cname; 
} 


public String getEmail() { 
    return email; 
} 


public void setEmail(String email) { 
    this.email = email; 
} 


public long getPhone() { 
    return phone; 
} 


public void setPhone(long phone) { 
    this.phone = phone; 
} 


public String getCity() { 
    return city; 
} 


public void setCity(String city) { 
    this.city = city; 
} 

public String toString(){ 
    return cid+"\t"+cname+"\t"+email+"\t"+phone+"\t"+city; 
} 

} 
を呼び出す

package com.jlcnindia.spring.jdbc; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import org.springframework.jdbc.core.RowMapper; 

public class CustomerRowMapper implements RowMapper<CustomerTO> { 

@Override 
public CustomerTO mapRow(ResultSet rs, int rn) throws SQLException { 
    System.out.println("mapping "); 
    CustomerTO cto=new CustomerTO(); 
    cto.setCid(rs.getInt(1)); 
    cto.setCname(rs.getString(2)); 
    cto.setEmail(rs.getString(3)); 
    cto.setPhone(rs.getLong(4)); 
    cto.setCity(rs.getString(5)); 
    return cto; 

} 

}

ダオ方法であり、

私は使っていますか?代わりに、指定されたパラメータの、それが正常に動作してくれた結果を与えている

public CustomerTO getCustomerByCid(int cid) { 
    String sql="select * from customers where cid=?"; 
    List<CustomerTO> list=jdbcTemp.query(sql, new CustomerRowMapper(),cid); 
    if(null!=list && !list.isEmpty()) 
    return list.get(0); 
    return null; 
} 

次のようにクエリ内のPARAMATERSの代わりにCIDを渡すが、私はパラメータのマップを渡した場合、私は例外を取得し、上記のように。理解することが

ことができないのはなぜ

UPDATE

春JBDCテンプレートの設定

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> 
<property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
<property name="url" value="jdbc:mysql://localhost/jlcindiadb"/> 
<property name="username" value="****"/> 
<property name="password" value="***"/> 
</bean> 
<bean id="jdbcTemp" class="org.springframework.jdbc.core.JdbcTemplate"  autowire="constructor"> 
<constructor-arg ref="dataSource"/> 
</bean> 
<bean id="jdbcCustomerDAO" class="com.jlcnindia.spring.jdbc.JdbcCustomerDAO"/> 
+0

'PreparedStatement'がどこにあるのかわかりませんが、ゼロまたは1からパラメータインデックスを開始していますか? (それは1つでなければならない)。 –

+0

春のjdbcテンプレートは基本的なjdbcではありません。春の設定について上記の私の更新をご覧ください – Zulfi

答えて

2

JdbcTemplateは、名前付きパラメータをサポートしていません。あなたは... NamedParameterJdbcTemplateが必要です。

あなたが呼び出しているメソッドはthat oneです:

あなたが見るように、引数としてパラメータの値をとり、
public <T> List<T> query(String sql, 
         RowMapper<T> rowMapper, 
         Object... args) 

。したがって、実際にはクエリの一意のインデックス付きパラメータとしてマップを渡していますが、クエリにはパラメータプレースホルダがないため、例外があります。

+0

ありがとうございます.. – Zulfi

関連する問題