2016-12-15 36 views
0

私はspring jdbcを使用しています。私のSQLクエリは 'IN'句を含む、私は動的に作成 '?入力に基づいて、 バリューjdbcテンプレートのメソッドを照会するオブジェクトの配列を渡します。春のJDBCクエリメソッドで配列を使用する方法spring jdbcの配列の使い方

public List<Student> getStudentName(String studentId){ 
    //studentId contains number of ids sepeated by comma. 
Object [] params= new Object[]{studentId.split(",")} 
    Stream<String> stream= Arrays.stream(studentId.split(",")); 

final String stInClauseParameters= stream.map(studentId -> "?").collect((Collectors.joining(","))); 


    StringBuilder sql = new StringBuilder(); 
    sql.append(" select studentName from Student where student_id IN ("+stInClauseParameters+")") 
    return JdbcTemplate.query(sql.toString(),params, new BeanPropertyRowMapper(Student.class)) 

    } 

エラー

Prepared Statement: Input parameter not set, index: 1.; nested exception is java.sql.SQLException: JZ0SA: Prepared Statement: Input parameter not set, index: 1 

答えて

1

より簡単な方法は、in節を動的に処理できるNamedParameterJdbcTemplateを使用することです。

例は以下のようになり

public class StudentDao extends JdbcDaoSupport { 


public List<Student> getStudentName(String studentId) { 

    List<String> studentIds = Arrays.asList(studentId.split(",")); 
    String sql = "SELECT studentName FROM Student WHERE student_id IN (:ids)"; 

    Map<String, List<String>> params = new HashMap<String, List<String>>(); 
    params.put("ids", studentIds); 

    NamedParameterJdbcTemplate template = new NamedParameterJdbcTemplate(getDataSource()); 
    return template.query(sql, params, new BeanPropertyRowMapper(Student.class)); 
} 

} 
関連する問題