2011-12-06 10 views
3

どうすれば修正できますか?私は私のクエリをテストし、それはMySQLのコマンドラインとワークベンチで動作しますが、私はこのエラーを私に与える私のJavaプログラム上でこのSQLクエリを使用しようとするとどうなるのですか?MySql JDBCテンプレートのStatementCallbackエラー

はここでここで、他のクラスがあります私のテストクラス

package test; 
import dao.FinanceDao; 
import javax.swing.JTextArea; 
import java.util.Scanner; 
import java.util.List; 
import javax.swing.JOptionPane; 
import domainmodel.User; 
import javax.sql.DataSource; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 

    public class TestDrive { 

     public static void main(String[] args){ 
      String employeeID = null; 
      String password = null; 
      JTextArea text = new JTextArea(); 
      FinanceDao finance = new FinanceDao(); 
      DataSource dataSource = SourceObj.getSource(); 

      finance.setDataSource(dataSource); 

      String idNumber = JOptionPane.showInputDialog("Enter Employee ID to Search"); 

      List<User> test = finance.select(idNumber); 
      for(User u: test){ 
      employeeID = u.getEmpID(); 
      password = u.getPassword(); 
      if(employeeID == null){ 
       text.setText("No Result"); 
      }else{ 
       text.setText("\tEmployeeID: "+employeeID+"\n\tPassword: "+password); 
       } 
      } 

      List <User> test1 = finance.selectAll(); 
      for(User ux: test1){ 
       employeeID = ux.getEmpID(); 
       password = ux.getPassword(); 
       System.out.println("\tEmployeeID: "+employeeID+"\n\tPassword: "+password); 
      } 

      UI U = new UI(text); 
     } 
    } 

package dao; 

import javax.sql.DataSource; 
import java.util.List; 
import org.springframework.jdbc.core.JdbcTemplate; 
import dao.mapper.UserRowMapper; 
import domainmodel.User; 

public class FinanceDao implements Manage { 

    private DataSource ds; 

    @Override 
    public void setDataSource(DataSource ds) { 
     this.ds = ds; 

    } 

    @Override 
    public void Add(String empID, String password) { 
     JdbcTemplate Add = new JdbcTemplate(ds); 
     Add.update("INSERT INTO user (empID,password) VALUES(?,?)", 
     new Object[] { empID, password }); 
    } 

    @Override 
    public void Delete(String empID , String password) { 
     JdbcTemplate Delete = new JdbcTemplate(ds); 
     Delete.update("Delete from User where emp_id = '?'",new Object[]{empID}); 
    } 


    public List<User> select(String empID) { 
     JdbcTemplate select = new JdbcTemplate(ds); 
     return select.query(
       "select * FROM USER where EMPID = ? ", 
       new Object[] { empID }, new UserRowMapper()); 
    } 

    public List<User>selectAll(){ 
     JdbcTemplate showAll = new JdbcTemplate(ds); 
     return showAll.query("Select empID from User", new UserRowMapper()); 
    } 

} 

マイ結果Extractorの

package dao.mapper; 

import java.sql.ResultSet; 
import java.sql.SQLException; 

import org.springframework.jdbc.core.ResultSetExtractor; 

import domainmodel.User; 

public class UserResultSetExtractor implements ResultSetExtractor{ 

    @Override 
    public Object extractData(ResultSet rs) throws SQLException{ 
      User user = new User(); 
      user.setEmpID(rs.getString(1)); 
      user.setPassword(rs.getString(2)); 
     return user; 
    } 

} 

そして最後に、このエラーがある

Dec 6, 2011 12:05:02 PM org.springframework.jdbc.datasource.DriverManagerDataSource setDriverClassName 
INFO: Loaded JDBC driver: com.mysql.jdbc.Driver 
Dec 6, 2011 12:05:09 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions 
INFO: Loading XML bean definitions from class path resource [org/springframework/jdbc/support/sql-error-codes.xml] 
Dec 6, 2011 12:05:09 PM org.springframework.jdbc.support.SQLErrorCodesFactory <init> 
INFO: SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase] 
Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: StatementCallback; uncategorized SQLException for SQL [Select empID from User]; SQL state [S1009]; error code [0]; Column Index out of range, 2 > 1. ; nested exception is java.sql.SQLException: Column Index out of range, 2 > 1. 
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.translate(SQLStateSQLExceptionTranslator.java:120) 
    at org.springframework.jdbc.support.SQLErrorCodeSQLExceptionTranslator.translate(SQLErrorCodeSQLExceptionTranslator.java:276) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:353) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:404) 
    at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:412) 
    at dao.FinanceDao.selectAll(FinanceDao.java:42) 
    at test.TestDrive.main(TestDrive.java:42) 
Caused by: java.sql.SQLException: Column Index out of range, 2 > 1. 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:927) 
    at com.mysql.jdbc.ResultSetImpl.checkColumnBounds(ResultSetImpl.java:818) 
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5651) 
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5570) 
    at dao.mapper.UserResultSetExtractor.extractData(UserResultSetExtractor.java:16) 
    at dao.mapper.UserRowMapper.mapRow(UserRowMapper.java:13) 
    at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:92) 
    at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:394) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:342) 
    ... 4 more 

どうすればこの問題を解決できますか?

答えて

2

ユーザーテーブルのように、2列しか表示されない場合があります。 user.setEmpID(rs.getString(0)); user.setPassword(rs.getString(1)); と使用する場合 user.setPassword(rs.getString(2)); 存在しない列番号3を取得しようとしているため、このエラーが発生しています。


は、すべての列を返すために、この中で、あなたのクエリを変更し

public List<User>selectAll(){ 
    JdbcTemplate showAll = new JdbcTemplate(ds); 
    return showAll.query("Select * from User", new UserRowMapper()); 
} 
+0

私のコードをuser.setEmpID(rs.getString(0))に変更しました。 user.setPassword(rs.getString(1)); SQLステート[S1009];エラーコード[0];カラムインデックスが0 <1 .;入れ子になっています。例外はjava.sql.SQLExceptionです。列インデックスが範囲外です。0 <1 " – user962206

+0

@ user962206:更新を参照してください。私は最初の試みで間違っていた。 –

+0

申し訳ありません、ありがとう! :) – user962206

2

どちらかあなたはハリーが示唆している何ができるか、手動で

public List<User>selectAll(){ 
     JdbcTemplate showAll = new JdbcTemplate(ds); 
     return showAll.query("Select empID, password from User", new UserRowMapper()); 
    } 

のようにすべての列を選択することができます実際のコードでは1つの列しか選択されておらず、ResultSetExtractorでは2つの列をフェッチしようとしています

public Object extractData(ResultSet rs) throws SQLException{ 
     User user = new User(); 
     user.setEmpId(rs.getString(1)); 
     user.setPassword(rs.getString(2));//Selecting one column and trying to get two, hence the error 
     return user; 
    } 
+0

今私は最終的にエラーが発生した理由を知って、ありがとう! – user962206

+1

喜んで助けになる:) – mprabhat