バインドが出来ないです。
NamedParameterJdbcTemplateの使い方が間違っていますでしょうか?
バインドさせずに直接パラメータを記述すると、期待した結果が得られています。
java
public List<WebboardDto> selectBySearch(String id, String name, String editName, String message) { var sb = new StringBuilder(); sb.append("SELECT "); sb.append(" * "); sb.append("FROM "); sb.append(" MESSAGE_BOARD "); sb.append("WHERE "); sb.append(" ID = :id "); sb.append(" AND CREATED_ID = :name "); sb.append(" AND NAME = :editName "); sb.append(" AND MESSAGE LIKE :message "); sb.append(" AND DELETE_FLAG = 0 "); sb.append("ORDER BY "); sb.append(" ID DESC "); // バインド用のインスタンスを生成します var ps = new MapSqlParameterSource(); ps.addValue("id", StringUtils.isNotBlank(id) ? id : "ID"); ps.addValue("name", StringUtils.isNotBlank(name) ? name : "CREATED_ID"); ps.addValue("editName", StringUtils.isNotBlank(editName) ? editName : "NAME"); ps.addValue("message", StringUtils.isNotBlank(message) ? "%" + message + "%" : "MESSAGE"); BeanPropertyRowMapper<WebboardDto> rm = BeanPropertyRowMapper.newInstance(WebboardDto.class); return namedParameterJdbcTemplate.query(sb.toString(), ps, rm);
ソースはこちら
java
package jp.co.sandbox.dao; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.stereotype.Repository; import jp.co.careritz.sandbox.dto.WebboardDto; /** * 掲示板DAO. * * @author ryosuke.tahara */ @Repository public class WebboardDao { /** * NamedParameterJdbcTemplateクラスのインスタンスを宣言 */ private NamedParameterJdbcTemplate np; /** * コンストラクタ * * @param np NamedParameterJdbcTemplate */ @Autowired public WebboardDao(NamedParameterJdbcTemplate np) { this.np = np; } /** * 全投稿取得 * * @return 全投稿 */ public List<WebboardDto> select() { var sb = new StringBuilder(); sb.append("SELECT "); sb.append(" ID "); sb.append(" , NAME "); sb.append(" , MESSAGE "); sb.append(" , CREATED_ID "); sb.append(" , CREATED_AT "); sb.append(" , UPDATED_ID "); sb.append(" , UPDATED_AT "); sb.append("FROM "); sb.append(" MESSAGE_BOARD "); sb.append("WHERE "); sb.append(" DELETE_FLAG = 0 "); sb.append("ORDER BY "); sb.append(" ID DESC "); BeanPropertyRowMapper<WebboardDto> rm = BeanPropertyRowMapper.newInstance(WebboardDto.class); return np.query(sb.toString(), rm); } /** * 投稿取得(id指定) * * @param id 取得対象のidをServiceクラスから受け取っています * @return 取得対象の投稿 */ public WebboardDto selectById(int id) { var sb = new StringBuilder(); sb.append("SELECT "); sb.append(" ID "); sb.append(" , NAME "); sb.append(" , MESSAGE "); sb.append(" , CREATED_ID "); sb.append(" , CREATED_AT "); sb.append(" , UPDATED_ID "); sb.append(" , UPDATED_AT "); sb.append("FROM "); sb.append(" MESSAGE_BOARD "); sb.append("WHERE "); sb.append(" ID = :id "); // バインド用のインスタンスを生成します var ps = new MapSqlParameterSource(); ps.addValue("id", id); BeanPropertyRowMapper<WebboardDto> rm = BeanPropertyRowMapper.newInstance(WebboardDto.class); return np.queryForObject(sb.toString(), ps, rm); } /** * 投稿取得(id, name, editName, message指定) * * @param id 取得したい投稿のid情報をServiceクラスから受け取っています * @param name 取得したい投稿のname情報をServiceクラスから受け取っています * @param editName 取得したい投稿のeditName情報をServiceクラスから受け取っています * @param message 取得したい投稿のmessage情報をServiceクラスから受け取っています * @return 取得対象の投稿 */ public List<WebboardDto> selectBySearch(String id, String name, String editName, String message) { var sb = new StringBuilder(); sb.append("SELECT "); sb.append(" * "); sb.append("FROM "); sb.append(" MESSAGE_BOARD "); sb.append("WHERE "); sb.append(" ID = :id "); sb.append(" AND CREATED_ID = :name "); sb.append(" AND NAME = :editName "); sb.append(" AND MESSAGE LIKE :message "); sb.append(" AND DELETE_FLAG = 0 "); sb.append("ORDER BY "); sb.append(" ID DESC "); // バインド用のインスタンスを生成します var ps = new MapSqlParameterSource(); ps.addValue("id", StringUtils.isNotBlank(id) ? id : "ID"); ps.addValue("name", StringUtils.isNotBlank(name) ? name : "CREATED_ID"); ps.addValue("editName", StringUtils.isNotBlank(editName) ? editName : "NAME"); ps.addValue("message", StringUtils.isNotBlank(message) ? "%" + message + "%" : "MESSAGE"); BeanPropertyRowMapper<WebboardDto> rm = BeanPropertyRowMapper.newInstance(WebboardDto.class); return np.query(sb.toString(), ps, rm); } /** * 新規投稿処理 * * @param name 入力されたnameをServiceクラスから受け取っています * @param message 入力されたmessageをServiceクラスから受け取っています */ public void post(String name, String message) { var sb = new StringBuilder(); sb.append("INSERT "); sb.append("INTO MESSAGE_BOARD( "); sb.append(" NAME "); sb.append(" , MESSAGE "); sb.append(" , DELETE_FLAG "); sb.append(" , CREATED_ID "); sb.append(" , CREATED_AT "); sb.append(" , UPDATED_ID "); sb.append(" , UPDATED_AT "); sb.append(") "); sb.append("VALUES (:name, :message, 0, :name, NOW(), :name, NOW()) "); // バインド用のインスタンスを生成します var ps = new MapSqlParameterSource(); ps.addValue("name", name); ps.addValue("message", message); // バインド後、SQLを実行します np.update(sb.toString(), ps); } /** * 削除処理 * * @param id 削除対象のidをServiceクラスから受け取っています */ public void delete(int id) { var sb = new StringBuilder(); sb.append("UPDATE MESSAGE_BOARD "); sb.append("SET "); sb.append(" DELETE_FLAG = 1 "); sb.append("WHERE "); sb.append(" ID = :id "); var ps = new MapSqlParameterSource(); ps.addValue("id", id); np.update(sb.toString(), ps); } /** * 編集処理 * * @param id 編集対象のidをServiceクラスから受け取っています * @param name 編集後のnameをServiceクラスから受け取っています * @param message 編集後のmessagをServiceクラスから受け取っています */ public void edit(int id, String name, String message) { var sb = new StringBuilder(); sb.append("UPDATE MESSAGE_BOARD "); sb.append("SET "); sb.append(" NAME = :name "); sb.append(" , UPDATED_ID = :name "); sb.append(" , MESSAGE = :message "); sb.append(" , UPDATED_AT = NOW() "); sb.append("WHERE "); sb.append(" ID = :id "); var ps = new MapSqlParameterSource(); ps.addValue("id", id); ps.addValue("name", name); ps.addValue("message", message); np.update(sb.toString(), ps); } }
まだ回答がついていません
会員登録して回答してみよう