#% DAOJavaソースファイル作成用の雛型ファイル
#% 2009/04/27 By S.Ito

#% === DAO =====================================================================
#! dao package
package #package#;

#loggerComment#import org.apache.log4j.Logger;
#! header postgreSQL
import org.postgresql.util.PGobject;
import java.util.HashSet;

#! header
import java.io.Serializable;
import java.math.BigDecimal;
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import java.text.SimpleDateFormat;

/**
 * #nameJp# データベースアクセスクラス
 *
 * @author
 *
 */
@SuppressWarnings("serial")
public class #mstName#Dao extends DaoBase implements RecordSearch, RecordAction, Serializable {

	// ユニークインデックス又は主キーエラー時のSQLステート値
	protected static final String UNIQUE_INDEX_OR_PRIMARY_KEY_VIOLATION = "#uniqueErrorCode#";

	// ロガー
	#loggerComment#private static Logger logger = Logger.getLogger(#mstName#Dao.class);

#! sql insert
	// 挿入用SQL
	protected static final String insertSql = "insert into #mstName#(" //
#! sql insert fields
			+ "#fields#" //
#! sql insert values
			+ ") values(#values#)";
#! sql update

	// 更新用SQL
	protected static final String updateSql = "update #mstName# set " //
#! sql update fields
			+ "#fields#" //
#! sql update where
			+ " where #where#";
#! sql delete

	// 削除用SQL
	protected static final String deleteSql = "delete from #mstName#" //
#! sql delete where
			+ " where #where#";
#! sql get

	// 取得用SQL
	protected static final String getSql = "select " //
#! sql get fields
			+ "#fields#" //
#! sql get from
			+ " from #mstName#" //
#! sql get where
			+ " where #where#";
#! sql search

	// 検索用SQL
	protected static final String searchSql = "select " //
#! sql search fields
			+ "#fields#" //
#! sql search from
			+ " from  #mstName#";
#! sql search primaryKeys

	// 主キー検索用SQL
	protected static final String searchPrimaryKeySql = "select " //
#! sql search primaryKeys fields
			+ "#fields#" //
#! sql search primaryKeys from
			+ " from  #mstName#";
#! sql search order

	// 検索並び順用SQL
	protected static final String searchOrderSql = "order by #fields#";

#! sql search list
	// 検索用のリスト
	private List<#mstName#> searchList;

#! sql search postgreSQL
	// ビットフィールドの名前セット
	private static HashSet<String> searchBitMap;

	static{
		searchBitMap = new  HashSet<String>();
#! sql search postgreSQL field
		searchBitMap.add("#fieldNmae#");
#! sql search postgreSQL end
	}

#! constructor
	/**
	 * コンストラクタ<BR>
	 * 単独で使用するとき
	 */
	public #mstName#Dao() {
		super();
	}

	/**
	 * コンストラクタ<BR>
	 * 複数のDAOを同一トランザクション内で使用するとき
	 *
	 * @param daoTransaction
	 *            DAO用トランザクション
	 */
	public #mstName#Dao(DaoTransaction daoTransaction) {
		super(daoTransaction);
	}

#! insert
	/**
	 * #nameJp#に1レコード挿入する
	 *
	 * @param rec
	 *           #nameJp#レコード
	 * @return 挿入件数（ユニークインデックス又は主キーエラー時は0）
	 * @throws SQLException
	 */
	public int insert(#mstName# rec) throws SQLException {

		try {

			PreparedStatement stmt = null;
			try{

#% シーケンス前処理
#! pre seq h2 identity
#% 		nothing!!
#! pre seq Integer
				if (rec.#getMethod#() == null) {
					int sno = (int)getSequence("#seqName#", #oracleSequence#);
					#loggerComment#logger.debug("get sequence #seqName# = " + sno);
					rec.#setMethod#(sno);
				}

#! pre seq Long
				if (rec.#getMethod#() == null) {
					long sno = getSequence("#seqName#", #oracleSequence#);
					#loggerComment#logger.debug("get sequence #seqName# = " + sno);
					rec.#setMethod#(sno);
				}

#! pre seq BigDecimal
				if (rec.#getMethod#() == null) {
					long sno = getSequence("#seqName#", #oracleSequence#);
					#loggerComment#logger.debug("get sequence #seqName# = " + sno);
					rec.#setMethod#(new BigDecimal(sno));
				}

#! insert start
				stmt = prepareStatement(insertSql);
				int parameterIndex = 1;
				#loggerComment#StringBuilder logParam = new StringBuilder("parameter : ");

#! insert String
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
					stmt.setString(parameterIndex++, rec.#getMethod#());
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.CHAR);
				}

#! insert String postgreSQL bit
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
					stmt.setObject(parameterIndex++, changeBitObject(rec.#getMethod#(), #modeFlag#, #length#));
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.OTHER);
				}

#! insert Integer
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
					stmt.setInt(parameterIndex++, rec.#getMethod#());
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.NUMERIC);
				}

#! insert Long
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
					stmt.setLong(parameterIndex++, rec.#getMethod#());
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.NUMERIC);
				}

#! insert BigDecimal
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#().toString() + ", ");
					stmt.setBigDecimal(parameterIndex++, rec.#getMethod#());
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.NUMERIC);
				}

#! insert Boolean h2
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
					stmt.setBoolean(parameterIndex++, rec.#getMethod#());
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.BOOLEAN);
				}

#! insert Boolean oracle
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + (rec.#getMethod#() ? 1 : 0) + ", ");
					stmt.setInt(parameterIndex++, rec.#getMethod#() ? 1 : 0);
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.NUMERIC);
				}

#! insert Date
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + ((new SimpleDateFormat("yyyy/MM/dd")).format(rec.#getMethod#())) + ", ");
					stmt.setDate(parameterIndex++, rec.#getMethod#());
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.DATE);
				}

#! insert Time
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + ((new SimpleDateFormat("HH:mm:ss")).format(rec.#getMethod#())) + ", ");
					stmt.setTime(parameterIndex++, rec.#getMethod#());
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.TIME);
				}

#! insert Timestamp
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=" + ((new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(rec.#getMethod#())) + ", ");
					stmt.setTimestamp(parameterIndex++, rec.#getMethod#());
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.TIMESTAMP);
				}

#! insert byte[]
				if (rec.#getMethod#() != null) {
					#loggerComment#logParam.append(parameterIndex + "=byte[" + (rec.#getMethod#().length) + "], ");
					stmt.setBytes(parameterIndex++, rec.#getMethod#());
				} else {
					#loggerComment#logParam.append(parameterIndex + "=null, ");
					stmt.setNull(parameterIndex++, java.sql.Types.BINARY);
				}

#! insert footer
				#loggerComment#logger.debug(insertSql);
				#loggerComment#logger.debug(logParam.toString());
				int rtn = stmt.executeUpdate();

#% シーケンス後処理
#! pre identity Integer
				rec.#setMethod#((int)getIdentity());

#! pre identity Long
				rec.#setMethod#(getIdentity());

#! pre identity BigDecimal
				rec.#setMethod#(new BigDecimal(getIdentity()));

#! insert footer 2
				commit();

				#loggerComment#logger.debug("insert 結果 = "+ rtn);
				return rtn;

			} catch (SQLException e) {

				// ユニークインデックス又は主キーエラーのときは0件挿入とする
				if (UNIQUE_INDEX_OR_PRIMARY_KEY_VIOLATION.equals(e.getSQLState())) {
					#loggerComment#logger.debug("insert 結果 = 0");
					return 0;
				}
				#loggerComment#logger.fatal("データベースへのレコード挿入処理でエラーが発生しました", e);
				throw e;
			}

		} finally {
			closeConnection();
		}
	}


#! update

	/**
	 * #nameJp#を更新する
	 *
	 * @param rec
	 *            #nameJp#レコード
	 * @return 更新件数
	 * @throws SQLException
	 */
	public int update(#mstName# rec) throws SQLException {

		try {

			PreparedStatement stmt = prepareStatement(updateSql);
			int parameterIndex = 1;
			#loggerComment#StringBuilder logParam = new StringBuilder("parameter : ");

#! update String
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
				stmt.setString(parameterIndex++, rec.#getMethod#());
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.CHAR);
			}

#! update String postgreSQL bit
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
				stmt.setObject(parameterIndex++, changeBitObject(rec.#getMethod#(), #modeFlag#, #length#));
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.OTHER);
			}

#! update Integer
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
				stmt.setInt(parameterIndex++, rec.#getMethod#());
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.NUMERIC);
			}

#! update Long
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
				stmt.setLong(parameterIndex++, rec.#getMethod#());
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.NUMERIC);
			}

#! update BigDecimal
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#().toString() + ", ");
				stmt.setBigDecimal(parameterIndex++, rec.#getMethod#());
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.NUMERIC);
			}

#! update Boolean h2
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
				stmt.setBoolean(parameterIndex++, rec.#getMethod#());
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.BOOLEAN);
			}

#! update Boolean oracle
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + (rec.#getMethod#() ? 1 : 0) + ", ");
				stmt.setInt(parameterIndex++, rec.#getMethod#() ? 1 : 0);
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.NUMERIC);
			}

#! update Date
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + ((new SimpleDateFormat("yyyy/MM/dd")).format(rec.#getMethod#())) + ", ");
				stmt.setDate(parameterIndex++, rec.#getMethod#());
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.DATE);
			}

#! update Time
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + ((new SimpleDateFormat("HH:mm:ss")).format(rec.#getMethod#())) + ", ");
				stmt.setTime(parameterIndex++, rec.#getMethod#());
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.TIME);
			}

#! update Timestamp
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + ((new SimpleDateFormat("yyyy/MM/dd HH:mm:ss")).format(rec.#getMethod#())) + ", ");
				stmt.setTimestamp(parameterIndex++, rec.#getMethod#());
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.TIMESTAMP);
			}

#! update byte[]
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=byte[" + (rec.#getMethod#().length) + "], ");
				stmt.setBytes(parameterIndex++, rec.#getMethod#());
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.BINARY);
			}

#! update key
			// 主キー
#! update key set
			#loggerComment#logParam.append(parameterIndex + "=" + changeString(rec.#getMethod#()) + ", ");
			stmt.setObject(parameterIndex++, rec.#getMethod#());
#! update key set postgreSQL bit
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
				stmt.setObject(parameterIndex++, changeBitObject(rec.#getMethod#(), #modeFlag#, #length#));
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.OTHER);
			}
#! update footer

			#loggerComment#logger.debug(updateSql);
			#loggerComment#logger.debug(logParam.toString());
			int rtn = stmt.executeUpdate();

			commit();

			#loggerComment#logger.debug("update 結果 = "+ rtn);
			return rtn;

		} catch (SQLException e) {
			#loggerComment#logger.fatal("データベースへのレコード更新処理でエラーが発生しました", e);
			throw e;
		} finally {
			closeConnection();
		}
	}

#! delete

	/**
	 * #nameJp#を削除する
	 *
	 * @param rec
	 *            #nameJp#マスタレコード
	 * @return 削除件数
	 * @throws SQLException
	 */
	public int delete(#mstName# rec) throws SQLException {

		try {
			PreparedStatement stmt = prepareStatement(deleteSql);
			int parameterIndex = 1;
			#loggerComment#StringBuilder logParam = new StringBuilder("parameter : ");

#! delete key
			// 主キー
#! delete key set
			#loggerComment#logParam.append(parameterIndex + "=" + changeString(rec.#getMethod#()) + ", ");
			stmt.setObject(parameterIndex++, rec.#getMethod#());
#! delete key set postgreSQL bit
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
				stmt.setObject(parameterIndex++, changeBitObject(rec.#getMethod#(), #modeFlag#, #length#));
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.OTHER);
			}
#! delete footer

			#loggerComment#logger.debug(deleteSql);
			#loggerComment#logger.debug(logParam.toString());
			int rtn = stmt.executeUpdate();

			commit();

			#loggerComment#logger.debug("delete 結果 = "+ rtn);
			return rtn;
			
		} catch (SQLException e) {
			#loggerComment#logger.fatal("データベースへのレコード削除処理でエラーが発生しました", e);
			throw e;
		} finally {
			closeConnection();
		}
	}

#! get

	/**
	 * #nameJp#を主キーを指定して取得
	 *
	 * @param rec
	 *            #nameJp#主キーレコード
	 * @return 取得された#nameJp#のレコード（対応するデータが存在しないときはnull）
	 * @throws SQLException
	 */
	public #mstName# get(#mstName# keyRecord) throws SQLException {

		#mstName# rec = null;

#! get check key
		// 主キーチェック
#! get check key set
		if(keyRecord.#getMethod#() == null){
			return rec;
		}

#! get key
		try {
			PreparedStatement stmt = prepareStatement(getSql);
			int parameterIndex = 1;
			#loggerComment#StringBuilder logParam = new StringBuilder("parameter : ");

			// 主キー
#! get key set
			#loggerComment#logParam.append(parameterIndex + "=" + changeString(keyRecord.#getMethod#()) + ", ");
			stmt.setObject(parameterIndex++, keyRecord.#getMethod#());
#! get key set postgreSQL bit
			if (rec.#getMethod#() != null) {
				#loggerComment#logParam.append(parameterIndex + "=" + rec.#getMethod#() + ", ");
				stmt.setObject(parameterIndex++, changeBitObject(rec.#getMethod#(), #modeFlag#, #length#));
			} else {
				#loggerComment#logParam.append(parameterIndex + "=null, ");
				stmt.setNull(parameterIndex++, java.sql.Types.OTHER);
			}
#! get ResultSet

			ResultSet res = null;

			try {
				#loggerComment#logger.debug(getSql);
				#loggerComment#logger.debug(logParam.toString());
				res = stmt.executeQuery();

				if (res.next()) {
					rec = new #mstName#();

#! get ResultSet String
					rec.#setMethod#(res.getString("#name#"));
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get ResultSet Int
					rec.#setMethod#(res.getInt("#name#"));
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get ResultSet Long
					rec.#setMethod#(res.getLong("#name#"));
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get ResultSet BigDecimal
					rec.#setMethod#(res.getBigDecimal("#name#"));
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get ResultSet Boolean h2
					rec.#setMethod#(res.getBoolean("#name#"));
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get ResultSet Boolean oracle
					rec.#setMethod#(res.getInt("#name#") == 1);
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get ResultSet Date
					rec.#setMethod#(res.getDate("#name#"));
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get ResultSet Time
					rec.#setMethod#(res.getTime("#name#"));
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get ResultSet Timestamp
					rec.#setMethod#(res.getTimestamp("#name#"));
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get ResultSet byte[]
					rec.#setMethod#(res.getBytes("#name#"));
					if (res.wasNull()) {
						rec.#setMethod#(null);
					}

#! get footer
					#loggerComment#logger.debug("select 結果 = 1");
				}else{
					#loggerComment#logger.debug("select 結果 = 0");
				}

			} finally {
				if (res != null) {
					res.close();
				}
			}

		} catch (SQLException e) {
			#loggerComment#logger.fatal("データベースへのレコード取得処理でエラーが発生しました", e);
			throw e;
		} finally {
			closeConnection();
		}

		return rec;
	}

#! get primaryKeyList header
	/**
	 * 指定されたkeyRecord内の有効な（nullでない）主キーを検索条件とし<BR>
	 * #nameJp#を検索し主キーのみ格納されてレコードのリストを取得する
	 *
	 * @param keyRecord
	 *            #nameJp#主キーレコード
	 * @return 取得された#nameJp#（主キーのみ格納）のリスト
	 * @throws SQLException
	 */
	public List<#mstName#> getPrimaryKeys(#mstName# keyRecord) throws SQLException {

		clearSearchParameter();

		// 有効な主キーの設定
#! get primaryKeyList set keys
		if (keyRecord.#getterName#() != null) {
			addSearchParameter("#name#", equal, keyRecord.#getterName#());
		}

#! get primaryKeyList search start
		final List<#mstName#> list = new LinkedList<#mstName#>();
		try {
			try {
				searchPrimaryKeys(new RecordAction() {
	
					@Override
					public void action(Object record) throws Exception {
						list.add((#mstName#)record);
					}
	
					@Override
					public void closeAction() throws Exception {
						// 何も行わない
					}
	
					@Override
					public void initAction() throws Exception {
						// 何も行わない
					}
				});
			} catch (Exception e) {
				throw new SQLException(e);
			}
		} catch (SQLException e) {
			#loggerComment#logger.fatal("データベースへの主キー検索処理でエラーが発生しました", e);
			throw e;
		}
		#loggerComment#logger.debug("select 結果 = "+list.size());
		return list;
	}


#! search

	/**
	 * #nameJp#検索
	 *
	 * @return 検索された#nameJp#のレコードリスト
	 * @throws SQLException
	 */
	public List<#mstName#> search() throws Exception {
		try {
			searchList = new LinkedList<#mstName#>();
	
			search(this);
	
			List<#mstName#> list = searchList;
			searchList = null;
			#loggerComment#logger.debug("select 結果 = "+list.size());
			return list;
		} catch (Exception e) {
			#loggerComment#logger.fatal("データベースへのレコード検索処理でエラーが発生しました", e);
			throw e;
		}
	}

	@Override
	public void initAction() throws Exception{
		//	何もしない
	}

	@Override
	public void action(Object record) throws Exception {
		searchList.add((#mstName#) record);
	}

	@Override
	public void closeAction() throws Exception {
		//	何もしない
	}

	/**
	 * #nameJp#検索
	 *
	 * @throws SQLException
	 */
	public void search(RecordAction searchAction) throws Exception {
		try {
			searchAction.initAction();

			try {
				String orderBy = makeSearchOrder();
				String sql = searchSql + makeSearchWhere() + " " +  (orderBy.length() > 0 ? orderBy : searchOrderSql);
				PreparedStatement stmt = prepareStatement(sql);
				setSearchWhere(stmt);

				ResultSet res = null;

				try {
					#loggerComment#logger.debug(sql);
					#loggerComment#logger.debug(getSearchParam());
					res = stmt.executeQuery();

					while (res.next()) {

						#mstName# rec = new #mstName#();

#! search ResultSet String
						rec.#setMethod#(res.getString("#name#"));
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search ResultSet Int
						rec.#setMethod#(res.getInt("#name#"));
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search ResultSet Long
						rec.#setMethod#(res.getLong("#name#"));
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search ResultSet BigDecimal
						rec.#setMethod#(res.getBigDecimal("#name#"));
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search ResultSet Boolean h2
						rec.#setMethod#(res.getBoolean("#name#"));
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search ResultSet Boolean oracle
						rec.#setMethod#(res.getInt("#name#") == 1);
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search ResultSet Date
						rec.#setMethod#(res.getDate("#name#"));
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search ResultSet Time
						rec.#setMethod#(res.getTime("#name#"));
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search ResultSet Timestamp
						rec.#setMethod#(res.getTimestamp("#name#"));
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search ResultSet byte[]
						rec.#setMethod#(res.getBytes("#name#"));
						if (res.wasNull()) {
							rec.#setMethod#(null);
						}

#! search footer
						// レコード毎の処理を呼び出す
						searchAction.action(rec);
					}

				} finally {
					if (res != null) {
						res.close();
					}
				}

			} finally {
				closeConnection();
			}
		} finally {
			searchAction.closeAction();
		}
	}


#! search primarykeys
	/**
	 * #nameJp#主キー検索
	 *
	 * @throws SQLException
	 */
	public void searchPrimaryKeys(RecordAction searchAction) throws Exception {
		try {
			searchAction.initAction();

			try {
				String sql = searchPrimaryKeySql + makeSearchWhere() + " " + searchOrderSql;
				PreparedStatement stmt = prepareStatement(sql);
				setSearchWhere(stmt);

				ResultSet res = null;

				try {
					#loggerComment#logger.debug(sql);
					#loggerComment#logger.debug(getSearchParam());
					res = stmt.executeQuery();

					while (res.next()) {

						#mstName# rec = new #mstName#();


#! footer postgreSQL
	/**
	 * 検索用SQLのWHERE区の1項目にパラメータ値を設定する
	 *
	 * @param stmt
	 * @param parameterIndex
	 * @param searcKeyValue
	 * @throws SQLException
	 */
	@Override
	protected void setSearchWhere(PreparedStatement stmt, int parameterIndex, SearcKeyValue searcKeyValue) throws SQLException {

		if (!searchBitMap.contains(searcKeyValue.keyName)) {
			super.setSearchWhere(stmt, parameterIndex, searcKeyValue);
			return;
		}

		SearcKeyValue bitKeyValue = new SearcKeyValue(searcKeyValue.keyName, searcKeyValue.searchMode, changeBitObject(
				(String) searcKeyValue.value, false, ((String) searcKeyValue.value).length()));
		super.setSearchWhere(stmt, parameterIndex, bitKeyValue);
	}

	/**
	 * postgreSQL・bit、varbitフィールドの変換
	 *
	 * @param value
	 *            ビット値（1,0の連続文字列）
	 * @param modeFlag
	 *            true=固定、false=可変
	 * @param length
	 *            最大フィールド長
	 * @return 変換されたオブジェクト
	 * @throws SQLException
	 */
	protected static PGobject changeBitObject(String value, boolean modeFlag, int length) throws SQLException {

		if (value == null) {
			value = "";
		}

		StringBuilder sb = new StringBuilder();
		int valueLength = value.length();

		for (int i = 0; i < length; i++) {
			if (i < valueLength) {
				char c = value.charAt(i);
				if (c == '1') {
					sb.append(c);
				} else {
					sb.append('0');
				}
			} else {
				if (modeFlag) {
					sb.append('0');
				} else {
					break;
				}
			}
		}

		PGobject object = new PGobject();
		object.setType("bit");
		object.setValue(sb.toString());

		return object;
	}

#! footer
}
#% === DAO Transaction =====================================================================
#! DaoTransaction package
package #package#;

#! DaoTransaction main
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Properties;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

/**
 * DAO用のトランザクション及びコネクションクラス
 */
public class DaoTransaction {

	/** コネクション */
	private Connection con = null;

	// プロパティファイル名
	private static final String propertyFileName = "/db.xml";

	// プロパティエラーフラグ
	private static boolean propertyError = false;

	// プロパティから得られたJDBCドライバー名
	private static String driverNname;

	// プロパティから得られたコネクション名
	private static String connectionString;

	// プロパティから得られたデータベース接続用ID
	private static String longinId;

	// プロパティから得られたデータベース接続用パスワード
	private static String longinPassword;

	// プリペアードステートメントマップ
	private HashMap<String, PreparedStatement> preparedStatementMap = new HashMap<String, PreparedStatement>();

	// プロパティから得られたコネクションプールフラグ
	private static boolean connectionPoolFlg;

	// datasource名
	protected static String dataSourceName = null;

	// EJBフラグ
	protected static boolean ejbFlag = false;

	// データ・ソース
	protected DataSource datasource = null;

	static {

		// プロパティ値の取得
		Properties properties = new Properties();
		InputStream stream = null;
		try {
			try {
				stream = DaoBase.class.getResourceAsStream(propertyFileName);
				properties.loadFromXML(stream);
			} finally {
				if (stream != null) {
					stream.close();
				}
			}
			driverNname = (String) properties.get("driver.name");
			connectionString = (String) properties.get("connection.string");
			longinId = (String) properties.get("login.id");
			longinPassword = (String) properties.get("login.password");

			connectionPoolFlg = "true".equalsIgnoreCase((String) properties.get("connectionPoolFlg"));
			dataSourceName = (String) properties.get("dataSourceName");

			ejbFlag = "true".equalsIgnoreCase((String) properties.get("ejbFlag"));

		} catch (IOException e) {
			propertyError = true;
		}
	}

	/**
	 * コンストラクタ
	 */
	public DaoTransaction() {

	}

	/**
	 * コンストラクタ 旧バージョンとの互換性のために存在する<BR>
	 * 通常は使用禁止
	 *
	 * @param con
	 *            コネクション
	 */
	@Deprecated
	public DaoTransaction(Connection con) {
		this.con = con;
	}

	/**
	 * コネクションを取得する
	 *
	 * @return コネクション
	 * @throws SQLException
	 */
	protected Connection getConnection() throws SQLException {

		// コネクションの取得
		if (propertyError) {
			throw new RuntimeException("プロパティファイルの読込に失敗しました");
		}

		if (connectionPoolFlg) {
			return getConnectionPool();
		} else {
			return getConnectionJdbc();
		}
	}

	/**
	 * コネクションプールよりコネクションを取得する
	 *
	 * @return コネクション
	 * @throws SQLException
	 */
	protected Connection getConnectionPool() throws SQLException {

		if (con == null) {

			try {
				InitialContext ic = new InitialContext();
				datasource = (DataSource) ic.lookup(dataSourceName);

				if (datasource == null) {
					throw new SQLException("コンテナーからDataSourceの取得に失敗しました");
				}
				con = datasource.getConnection();
				if (!ejbFlag) {
					con.setAutoCommit(false);
				}

			} catch (NamingException e) {
				throw new SQLException(e.getMessage(), e);
			}
		}

		return con;
	}

	/**
	 * コネクションを取得する
	 *
	 * @return コネクション
	 * @throws SQLException
	 */
	protected Connection getConnectionJdbc() throws SQLException {
		if (con == null) {

			try {
				Class.forName(driverNname);
			} catch (ClassNotFoundException e) {
				throw new SQLException("JDBCが使用できません", e);
			}
			con = DriverManager.getConnection(connectionString, longinId, longinPassword);
			if (!ejbFlag) {
				con.setAutoCommit(false);
			}
		}

		return con;
	}

	/**
	 * PreparedStatementオブジェクトを取得する<BR>
	 * このメソッドで取得した PreparedStatementオブジェクトはキャッシュされ<BR>
	 * 自動的にクローズされるのでクローズしてはいけない
	 *
	 * @param sql
	 *            SQL文
	 * @return プリペアステートメント
	 * @throws SQLException
	 */
	public PreparedStatement prepareStatement(String sql) throws SQLException {
		if (preparedStatementMap.containsKey(sql)) {
			return preparedStatementMap.get(sql);
		}

		PreparedStatement pstmt = getConnection().prepareStatement(sql);
		preparedStatementMap.put(sql, pstmt);

		return pstmt;
	}

	/**
	 * トランザクションをコミットする
	 *
	 * @throws SQLException
	 */
	public void commit() throws SQLException {
		if (!ejbFlag) {
			getConnection().commit();
		}
	}

	/**
	 * DAO用のトランザクションをクルーズする
	 *
	 * @throws SQLException
	 */
	public void close() throws SQLException {

		if (con == null) {
			return;
		}

		try {
			try {

				// キャッシュされた PreparedStatementオブジェクトを全てクローズする
				for (PreparedStatement pstmt : preparedStatementMap.values()) {
					pstmt.close();
				}

			} finally {
				// ロールバック
				if (!ejbFlag) {
					con.rollback();
				}
			}

		} finally {
			preparedStatementMap.clear();
			con.close();
			con = null;
		}
	}
}

#!
#% === DAO Base =====================================================================
#! daoBase package
package #package#;

#! daoBase main
import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Time;
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.LinkedList;
import java.util.List;
import java.math.BigDecimal;

/**
 * DAOの基底となるクラス
 *
 * @author
 *
 */
public abstract class DaoBase {

	// トランザクション
	DaoTransaction daoTran = null;

	// 検索用モード：等しい（完全一致）
	public static final int equal = 1;

	// 検索用モード：前方一致（文字型のみ有効）
	public static final int like = 2;

	// 検索用モード：大なりイコール（>=）
	public static final int bigEqual = 3;

	// 検索用モード：大なり（>）
	public static final int big = 4;

	// 検索用モード：小なりイコール（<=）
	public static final int smallEqual = 5;

	// 検索用モード：小なり（<）
	public static final int small = 6;

	// 検索用モード：不一致（<>）
	public static final int notEqual = 7;

	// 検索用のキーと値リスト
	private List<SearcKeyValue> searchKeyValueList = new LinkedList<SearcKeyValue>();

	// ソートモード：昇順
	private static final int SORT_MODE_ASC = 1;

	// ソートモード：降順
	private static final int SORT_MODE_DESC = 2;

	// ソートキーリスト
	private List<SortKey> sortKeyList = new LinkedList<SortKey>();

	/**
	 * コネクションをクローズせずに保持しておくことを許可するフラグ
	 */
	private boolean keepConnection;

	/**
	 * コンストラクタ
	 */
	public DaoBase() {
		daoTran = new DaoTransaction();
		keepConnection = false;
	}

	/**
	 * コンストラクタ
	 *
	 * @param daoTran
	 *            トランザクション
	 */
	public DaoBase(DaoTransaction daoTran) {
		this.daoTran = daoTran;
		keepConnection = true;
	}

	/**
	 * コミットを行う
	 *
	 * @throws SQLException
	 */
	public void commit() throws SQLException {
		if (keepConnection) {
			return;
		}

		daoTran.commit();
	}

	/**
	 * PreparedStatementオブジェクトの取得
	 *
	 * @param sql
	 *            SQL文
	 * @return PreparedStatementオブジェクト
	 * @throws SQLException
	 */
	public PreparedStatement prepareStatement(String sql) throws SQLException {
		if (keepConnection == false && daoTran == null) {
			daoTran = new DaoTransaction();
		}

		return daoTran.prepareStatement(sql);
	}

	/**
	 * コネクションをクローズする<br>
	 * ただし、コネクションキープ時はクローズしない
	 *
	 * @throws SQLException
	 */
	public void closeConnection() throws SQLException {
		if (keepConnection) {
			return;
		}

		daoTran.close();
		daoTran = null;
	}

	/**
	 * 検索用パラメータをクリアする
	 */
	public void clearSearchParameter() {
		searchKeyValueList.clear();
	}

	/**
	 * 検索用パラメータを追加する
	 *
	 * @param keyNmae
	 * @param mode
	 * @param value
	 */
	public void addSearchParameter(String keyNmae, int mode, Object value) {
		if (mode != equal && mode != like && mode != bigEqual && mode != big //
				&& mode != smallEqual && mode != small && mode != notEqual) {
			return;
		}

		if (value == null) {
			return;
		}

		if ((value instanceof String) && ((String) value).trim().length() <= 0) {
			return;
		}

		searchKeyValueList.add(new SearcKeyValue(keyNmae, mode, value));
	}

	/**
	 * 検索用SQLのWHERE区を作成する
	 *
	 * @return
	 */
	protected String makeSearchWhere() {

		StringBuilder sb = new StringBuilder();

		for (SearcKeyValue searcKeyValue : searchKeyValueList) {

			if (sb.length() > 0) {
				sb.append(" and ");
			}
			sb.append(searcKeyValue.keyName);
			if (searcKeyValue.searchMode == equal) {
				sb.append("=?");
			} else if (searcKeyValue.searchMode == like) {
				if (searcKeyValue.value instanceof String) {
					sb.append(" like ");
					sb.append("?");
				} else {
					sb.append("=?");
				}
			} else if (searcKeyValue.searchMode == bigEqual) {
				sb.append(">=?");
			} else if (searcKeyValue.searchMode == big) {
				sb.append(">?");
			} else if (searcKeyValue.searchMode == smallEqual) {
				sb.append("<=?");
			} else if (searcKeyValue.searchMode == small) {
				sb.append("<?");
			} else if (searcKeyValue.searchMode == notEqual) {
				sb.append("<>?");
			}
		}

		if (sb.length() <= 0) {
			return "";
		}

		return " where " + sb.toString();
	}

	/**
	 * 検索用SQLのWHERE区にパラメータ値を設定する
	 *
	 * @return
	 */
	protected void setSearchWhere(PreparedStatement stmt) throws SQLException {

		int parameterIndex = 1;

		for (SearcKeyValue searcKeyValue : searchKeyValueList) {
			setSearchWhere(stmt, parameterIndex, searcKeyValue);
			parameterIndex++;
		}
	}

	/**
	 * 検索用SQLのWHERE区の1項目にパラメータ値を設定する
	 *
	 * @param stmt
	 * @param parameterIndex
	 * @param searcKeyValue
	 * @throws SQLException
	 */
	protected void setSearchWhere(PreparedStatement stmt, int parameterIndex, SearcKeyValue searcKeyValue) throws SQLException {
		if (searcKeyValue.value instanceof String && searcKeyValue.searchMode == like) {
			stmt.setObject(parameterIndex, ((String) searcKeyValue.value) + "%");
		} else {
			stmt.setObject(parameterIndex, searcKeyValue.value);
		}
	}
	
	/**
	 * 検索用パラメータ値を文字列として取得する
	 *
	 * @return
	 */
	protected String getSearchParam() {

		int parameterIndex = 1;
		StringBuilder sb = new StringBuilder("parameter : ");

		for (SearcKeyValue searcKeyValue : searchKeyValueList) {
			sb.append(parameterIndex++);
			sb.append("=");
			if (searcKeyValue.value instanceof String && searcKeyValue.searchMode == like) {
				sb.append(changeString(((String) searcKeyValue.value) + "%"));
			} else {
				sb.append(changeString(searcKeyValue.value));
			}
			sb.append(", ");
		}
		
		return sb.toString();
	}

	/**
	 * 検索用データクラス
	 */
	class SearcKeyValue {
		public String keyName;
		public int searchMode;
		public Object value;

		/**
		 * コンストラクタ
		 *
		 * @param keyName
		 * @param searchMode
		 * @param value
		 */
		public SearcKeyValue(String keyName, int searchMode, Object value) {
			this.keyName = keyName;
			this.searchMode = searchMode;
			this.value = value;
		}
	}

	/**
	 * ソートパラメータをクリアする
	 */
	public void clearSortParameter() {
		sortKeyList.clear();
	}

	/**
	 * ソート昇順パラメータを追加する
	 *
	 * @param fieldNmae
	 *            フィールド名
	 */
	public void addSortAscParameter(String fieldNmae) {
		sortKeyList.add(new SortKey(fieldNmae, SORT_MODE_ASC));
	}

	/**
	 * ソート降順パラメータを追加する
	 *
	 * @param fieldNmae
	 *            フィールド名
	 */
	public void addSortDescParameter(String fieldNmae) {
		sortKeyList.add(new SortKey(fieldNmae, SORT_MODE_DESC));
	}

	/**
	 * ソート用SQLのORDER区を作成する
	 *
	 * @return
	 */
	protected String makeSearchOrder() {

		StringBuilder sb = new StringBuilder();

		for (SortKey sortKey : sortKeyList) {

			if (sb.length() > 0) {
				sb.append(", ");
			}
			sb.append(sortKey.keyName);

			if (sortKey.sortMode == SORT_MODE_DESC) {
				sb.append(" desc");
			}
		}

		if (sb.length() <= 0) {
			return "";
		}

		return " order by " + sb.toString();
	}

	/**
	 * ソートキークラス
	 */
	class SortKey {
		public String keyName;
		public int sortMode;

		/**
		 * コンストラクタ
		 *
		 * @param keyName
		 * @param searchMode
		 * @param value
		 */
		public SortKey(String keyName, int sortMode) {
			this.keyName = keyName;
			this.sortMode = sortMode;
		}
	}

	/**
	 * シーケンスを取得する
	 *
	 * @param sequenceName
	 *            シーケンス名
	 * @param oracleSequence
	 *            ORACLEのシーケンス時はtrue
	 * @return シーケンス値
	 * @throws SQLException
	 */
	public long getSequence(String sequenceName, boolean oracleSequence) throws SQLException {

		ResultSet res = null;
		try {
			if (oracleSequence) {
				res = prepareStatement("select " + sequenceName + ".nextval from dual").executeQuery();
			} else {
				res = prepareStatement("select nextval('" + sequenceName + "')").executeQuery();
			}

			if (res.next()) {
				long ret = res.getLong(1);
				if (!res.wasNull()) {
					return ret;
				}
			}
			throw new SQLException("シーケンスの取得に失敗しました " + sequenceName);

		} finally {
			if (res != null) {
				res.close();
				res = null;
			}
		}
	}

	/**
	 * Identityを取得する
	 *
	 * @return Identity値
	 * @throws SQLException
	 */
	public long getIdentity() throws SQLException {

		ResultSet res = null;
		try {
			res = prepareStatement("select identity()").executeQuery();

			if (res.next()) {
				long ret = res.getLong(1);
				if (!res.wasNull()) {
					return ret;
				}
			}
			throw new SQLException("identityの取得に失敗しました");
		} finally {
			if (res != null) {
				res.close();
				res = null;
			}
		}
	}

	// / 以下のメソッドは退役しました。過去のバージョンとの互換性のために存在しています。

	/**
	 * データベースコネクションの取得<BR>
	 * 過去バージョンとの互換のためのみ存在している<BR>
	 * 通常は使用禁止
	 *
	 * @return
	 * @throws SQLException
	 */
	@Deprecated
	public Connection getConnection() throws SQLException {

		return daoTran.getConnection();
	}

	/**
	 * コネクションを設定する<BR>
	 * 過去バージョンとの互換のためのみ存在している<BR>
	 * 通常は使用禁止
	 *
	 * @param con
	 *            コネクション
	 */
	@Deprecated
	public void setConnection(Connection con) {
		daoTran = new DaoTransaction(con);
	}

	/**
	 * コネクションをキープの設定を行う<BR>
	 * 過去バージョンとの互換のためのみ存在している<BR>
	 * 通常は使用禁止
	 *
	 * @param keepConnection
	 *            true=コネクションをキープする
	 */
	@Deprecated
	public void setKeepConnection(boolean keepConnection) {
		this.keepConnection = keepConnection;
	}

	/**
	 * コネクションをキープの確認を行う<BR>
	 * 過去バージョンとの互換のためのみ存在している<BR>
	 * 通常は使用禁止
	 *
	 * @return true=コネクションをキープ
	 */
	@Deprecated
	public boolean isKeepConnection() {
		return keepConnection;
	}

	/**
	 * シーケンスを取得する<BR>
	 * 過去バージョンとの互換のためのみ存在している<BR>
	 * 通常は使用禁止
	 *
	 * @param sequenceName
	 *            シーケンス名
	 * @param oracleSequence
	 *            ORACLEのシーケンス時はtrue
	 * @return シーケンス値
	 * @throws SQLException
	 */
	@Deprecated
	public long getSequence(Connection con, String sequenceName, boolean oracleSequence) throws SQLException {

		PreparedStatement stmt = null;
		try {
			if (oracleSequence) {
				stmt = con.prepareStatement("select " + sequenceName + ".nextval from dual");
			} else {
				stmt = con.prepareStatement("select nextval('" + sequenceName + "')");
			}
			ResultSet res = null;
			try {
				res = stmt.executeQuery();

				if (res.next()) {
					long ret = res.getLong(1);
					if (!res.wasNull()) {
						return ret;
					}
				}
				throw new SQLException("シーケンスの取得に失敗しました " + sequenceName);
			} finally {
				if (res != null) {
					res.close();
				}
			}
		} finally {
			if (stmt != null) {
				stmt.close();
			}
		}
	}

	/**
	 * Identityを取得する<BR>
	 * 過去バージョンとの互換のためのみ存在している<BR>
	 * 通常は使用禁止
	 *
	 * @return Identity値
	 * @throws SQLException
	 */
	@Deprecated
	public long getIdentity(Connection con) throws SQLException {

		PreparedStatement stmt = null;
		try {
			stmt = con.prepareStatement("select identity()");
			ResultSet res = null;
			try {
				res = stmt.executeQuery();

				if (res.next()) {
					long ret = res.getLong(1);
					if (!res.wasNull()) {
						return ret;
					}
				}
				throw new SQLException("identityの取得に失敗しました");
			} finally {
				if (res != null) {
					res.close();
				}
			}
		} finally {
			if (stmt != null) {
				stmt.close();
			}
		}
	}

	/**
	 * ObjectからclassObjectで指定されたクラスのオブジェクトへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param classObject
	 *            変換後のクラス
	 * @return 変換された値
	 */
	public static Object changeObject(Object value, Class<?> classObject) {
		if (value == null) {
			return null;
		}
		if (String.class.isAssignableFrom(classObject)) {
			return changeString(value);
		}
		if (Integer.class.isAssignableFrom(classObject)) {
			return changeInteger(value);
		}
		if (Long.class.isAssignableFrom(classObject)) {
			return changeLong(value);
		}
		if (BigDecimal.class.isAssignableFrom(classObject)) {
			return changeBigDecimal(value);
		}
		if (byte[].class.isAssignableFrom(classObject)) {
			return changeBytes(value);
		}
		if (Date.class.isAssignableFrom(classObject)) {
			return changeDate(value);
		}
		if (Time.class.isAssignableFrom(classObject)) {
			return changeTime(value);
		}
		if (Timestamp.class.isAssignableFrom(classObject)) {
			return changeTimestamp(value);
		}
		if (Boolean.class.isAssignableFrom(classObject)) {
			return changeBoolean(value);
		}
		return value;
	}

	/**
	 * ObjectからStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @return 変換された値
	 */
	public static String changeString(Object value) {
		if (value == null) {
			return null;
		}
		if (value instanceof String) {
			return changeString((String) value, false);
		}
		if (value instanceof Integer) {
			return changeString((Integer) value, false);
		}
		if (value instanceof Long) {
			return changeString((Long) value, false);
		}
		if (value instanceof BigDecimal) {
			return changeString((BigDecimal) value, false);
		}
		if (value instanceof byte[]) {
			return changeString((byte[]) value, false);
		}
		if (value instanceof Date) {
			return changeString((Date) value, false);
		}
		if (value instanceof Time) {
			return changeString((Time) value, false);
		}
		if (value instanceof Timestamp) {
			return changeString((Timestamp) value, false);
		}
		if (value instanceof Boolean) {
			return changeString((Boolean) value, false);
		}
		return value.toString();
	}

	/**
	 * ObjectからIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @return 変換された値
	 */
	public static Integer changeInteger(Object value) {
		if (value == null) {
			return null;
		}
		if (value instanceof String) {
			return changeInteger((String) value, false);
		}
		if (value instanceof Integer) {
			return changeInteger((Integer) value, false);
		}
		if (value instanceof Long) {
			return changeInteger((Long) value, false);
		}
		if (value instanceof BigDecimal) {
			return changeInteger((BigDecimal) value, false);
		}
		if (value instanceof byte[]) {
			return changeInteger((byte[]) value, false);
		}
		if (value instanceof Date) {
			return changeInteger((Date) value, false);
		}
		if (value instanceof Time) {
			return changeInteger((Time) value, false);
		}
		if (value instanceof Timestamp) {
			return changeInteger((Timestamp) value, false);
		}
		if (value instanceof Boolean) {
			return changeInteger((Boolean) value, false);
		}
		throw new RuntimeException("変換対象外のクラスのオブジェクトが指定されました");
	}

	/**
	 * ObjectからLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @return 変換された値
	 */
	public static Long changeLong(Object value) {
		if (value == null) {
			return null;
		}
		if (value instanceof String) {
			return changeLong((String) value, false);
		}
		if (value instanceof Integer) {
			return changeLong((Integer) value, false);
		}
		if (value instanceof Long) {
			return changeLong((Long) value, false);
		}
		if (value instanceof BigDecimal) {
			return changeLong((BigDecimal) value, false);
		}
		if (value instanceof byte[]) {
			return changeLong((byte[]) value, false);
		}
		if (value instanceof Date) {
			return changeLong((Date) value, false);
		}
		if (value instanceof Time) {
			return changeLong((Time) value, false);
		}
		if (value instanceof Timestamp) {
			return changeLong((Timestamp) value, false);
		}
		if (value instanceof Boolean) {
			return changeLong((Boolean) value, false);
		}
		throw new RuntimeException("変換対象外のクラスのオブジェクトが指定されました");
	}

	/**
	 * ObjectからBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(Object value) {
		if (value == null) {
			return null;
		}
		if (value instanceof String) {
			return changeBigDecimal((String) value, false);
		}
		if (value instanceof Integer) {
			return changeBigDecimal((Integer) value, false);
		}
		if (value instanceof Long) {
			return changeBigDecimal((Long) value, false);
		}
		if (value instanceof BigDecimal) {
			return changeBigDecimal((BigDecimal) value, false);
		}
		if (value instanceof byte[]) {
			return changeBigDecimal((byte[]) value, false);
		}
		if (value instanceof Date) {
			return changeBigDecimal((Date) value, false);
		}
		if (value instanceof Time) {
			return changeBigDecimal((Time) value, false);
		}
		if (value instanceof Timestamp) {
			return changeBigDecimal((Timestamp) value, false);
		}
		if (value instanceof Boolean) {
			return changeBigDecimal((Boolean) value, false);
		}
		throw new RuntimeException("変換対象外のクラスのオブジェクトが指定されました");
	}

	/**
	 * Objectからbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @return 変換された値
	 */
	public static byte[] changeBytes(Object value) {
		if (value == null) {
			return null;
		}
		if (value instanceof String) {
			return changeBytes((String) value, false);
		}
		if (value instanceof Integer) {
			return changeBytes((Integer) value, false);
		}
		if (value instanceof Long) {
			return changeBytes((Long) value, false);
		}
		if (value instanceof BigDecimal) {
			return changeBytes((BigDecimal) value, false);
		}
		if (value instanceof byte[]) {
			return changeBytes((byte[]) value, false);
		}
		if (value instanceof Date) {
			return changeBytes((Date) value, false);
		}
		if (value instanceof Time) {
			return changeBytes((Time) value, false);
		}
		if (value instanceof Timestamp) {
			return changeBytes((Timestamp) value, false);
		}
		if (value instanceof Boolean) {
			return changeBytes((Boolean) value, false);
		}
		throw new RuntimeException("変換対象外のクラスのオブジェクトが指定されました");
	}

	/**
	 * ObjectからDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @return 変換された値
	 */
	public static Date changeDate(Object value) {
		if (value == null) {
			return null;
		}
		if (value instanceof String) {
			return changeDate((String) value, false);
		}
		if (value instanceof Integer) {
			return changeDate((Integer) value, false);
		}
		if (value instanceof Long) {
			return changeDate((Long) value, false);
		}
		if (value instanceof BigDecimal) {
			return changeDate((BigDecimal) value, false);
		}
		if (value instanceof byte[]) {
			return changeDate((byte[]) value, false);
		}
		if (value instanceof Date) {
			return changeDate((Date) value, false);
		}
		if (value instanceof Time) {
			return changeDate((Time) value, false);
		}
		if (value instanceof Timestamp) {
			return changeDate((Timestamp) value, false);
		}
		if (value instanceof Boolean) {
			return changeDate((Boolean) value, false);
		}
		throw new RuntimeException("変換対象外のクラスのオブジェクトが指定されました");
	}

	/**
	 * ObjectからTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @return 変換された値
	 */
	public static Time changeTime(Object value) {
		if (value == null) {
			return null;
		}
		if (value instanceof String) {
			return changeTime((String) value, false);
		}
		if (value instanceof Integer) {
			return changeTime((Integer) value, false);
		}
		if (value instanceof Long) {
			return changeTime((Long) value, false);
		}
		if (value instanceof BigDecimal) {
			return changeTime((BigDecimal) value, false);
		}
		if (value instanceof byte[]) {
			return changeTime((byte[]) value, false);
		}
		if (value instanceof Date) {
			return changeTime((Date) value, false);
		}
		if (value instanceof Time) {
			return changeTime((Time) value, false);
		}
		if (value instanceof Timestamp) {
			return changeTime((Timestamp) value, false);
		}
		if (value instanceof Boolean) {
			return changeTime((Boolean) value, false);
		}
		throw new RuntimeException("変換対象外のクラスのオブジェクトが指定されました");
	}

	/**
	 * ObjectからTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(Object value) {
		if (value == null) {
			return null;
		}
		if (value instanceof String) {
			return changeTimestamp((String) value, false);
		}
		if (value instanceof Integer) {
			return changeTimestamp((Integer) value, false);
		}
		if (value instanceof Long) {
			return changeTimestamp((Long) value, false);
		}
		if (value instanceof BigDecimal) {
			return changeTimestamp((BigDecimal) value, false);
		}
		if (value instanceof byte[]) {
			return changeTimestamp((byte[]) value, false);
		}
		if (value instanceof Date) {
			return changeTimestamp((Date) value, false);
		}
		if (value instanceof Time) {
			return changeTimestamp((Time) value, false);
		}
		if (value instanceof Timestamp) {
			return changeTimestamp((Timestamp) value, false);
		}
		if (value instanceof Boolean) {
			return changeTimestamp((Boolean) value, false);
		}
		throw new RuntimeException("変換対象外のクラスのオブジェクトが指定されました");
	}

	/**
	 * ObjectからBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(Object value) {
		if (value == null) {
			return null;
		}
		if (value instanceof String) {
			return changeBoolean((String) value, false);
		}
		if (value instanceof Integer) {
			return changeBoolean((Integer) value, false);
		}
		if (value instanceof Long) {
			return changeBoolean((Long) value, false);
		}
		if (value instanceof BigDecimal) {
			return changeBoolean((BigDecimal) value, false);
		}
		if (value instanceof byte[]) {
			return changeBoolean((byte[]) value, false);
		}
		if (value instanceof Date) {
			return changeBoolean((Date) value, false);
		}
		if (value instanceof Time) {
			return changeBoolean((Time) value, false);
		}
		if (value instanceof Timestamp) {
			return changeBoolean((Timestamp) value, false);
		}
		if (value instanceof Boolean) {
			return changeBoolean((Boolean) value, false);
		}
		throw new RuntimeException("変換対象外のクラスのオブジェクトが指定されました");
	}

	/**
	 * StringからStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static String changeString(String value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value;
	}

	/**
	 * IntegerからStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static String changeString(Integer value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value.toString();
	}

	/**
	 * LongからStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static String changeString(Long value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value.toString();
	}

	/**
	 * BigDecimalからStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static String changeString(BigDecimal value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value.toString();
	}

	/**
	 * byte[] からStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static String changeString(byte[] value, boolean nullFlag) {
		return null;
	}

	/**
	 * DateからStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static String changeString(Date value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return (new SimpleDateFormat("yyyy/MM/dd")).format(value);
	}

	/**
	 * TimeからStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static String changeString(Time value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return (new SimpleDateFormat("HH:mm:ss")).format(value);
	}

	/**
	 * TimestampからStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static String changeString(Timestamp value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return (new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS")).format(value);
	}

	/**
	 * BooleanからStringへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static String changeString(Boolean value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value.toString();
	}

	/**
	 * StringからIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Integer changeInteger(String value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		try {
			return Integer.parseInt(value);
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * IntegerからIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Integer changeInteger(Integer value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		return value;
	}

	/**
	 * LongからIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Integer changeInteger(Long value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		return value.intValue();
	}

	/**
	 * BigDecimalからIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Integer changeInteger(BigDecimal value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value.intValue();
	}

	/**
	 * byte[] からIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Integer changeInteger(byte[] value, boolean nullFlag) {
		return null;
	}

	/**
	 * DateからIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Integer changeInteger(Date value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		try {
			return Integer.parseInt((new SimpleDateFormat("yyyyMMdd")).format(value));
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * TimeからIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Integer changeInteger(Time value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		try {
			return Integer.parseInt((new SimpleDateFormat("HHmmss")).format(value));
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * TimestampからIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Integer changeInteger(Timestamp value, boolean nullFlag) {
		return null;
	}

	/**
	 * BooleanからIntegerへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Integer changeInteger(Boolean value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value ? 1 : 0;
	}

	/**
	 * StringからLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Long changeLong(String value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		try {
			return Long.parseLong(value);
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * IntegerからLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Long changeLong(Integer value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value.longValue();
	}

	/**
	 * LongからLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Long changeLong(Long value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value;
	}

	/**
	 * BigDecimalからLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Long changeLong(BigDecimal value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value.longValue();
	}

	/**
	 * byte[] からLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Long changeLong(byte[] value, boolean nullFlag) {
		return null;
	}

	/**
	 * DateからLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Long changeLong(Date value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		try {
			return Long.parseLong((new SimpleDateFormat("yyyyMMdd")).format(value));
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * TimeからLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Long changeLong(Time value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		try {
			return Long.parseLong((new SimpleDateFormat("HHmmss")).format(value));
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * TimestampからLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Long changeLong(Timestamp value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		try {
			return Long.parseLong((new SimpleDateFormat("yyyyMMddHHmmssSSS")).format(value));
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * BooleanからLongへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Long changeLong(Boolean value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value ? 1L : 0L;
	}

	/**
	 * StringからBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(String value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		try {
			return new BigDecimal(value);
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * IntegerからBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(Integer value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return BigDecimal.valueOf(value.longValue());
	}

	/**
	 * LongからBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(Long value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return BigDecimal.valueOf(value.longValue());
	}

	/**
	 * BigDecimalからBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(BigDecimal value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value;
	}

	/**
	 * byte[] からBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(byte[] value, boolean nullFlag) {
		return null;
	}

	/**
	 * DateからBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(Date value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		try {
			return BigDecimal.valueOf(Long.parseLong((new SimpleDateFormat("yyyyMMdd")).format(value)));
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * TimeからBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(Time value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		try {
			return BigDecimal.valueOf(Long.parseLong((new SimpleDateFormat("HHmmss")).format(value)));
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * TimestampからBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(Timestamp value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		try {
			return BigDecimal.valueOf(Long.parseLong((new SimpleDateFormat("yyyyMMddHHmmssSSS")).format(value)));
		} catch (NumberFormatException e) {
			return null;
		}
	}

	/**
	 * BooleanからBigDecimalへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static BigDecimal changeBigDecimal(Boolean value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value ? BigDecimal.ONE : BigDecimal.ZERO;
	}

	/**
	 * Stringからbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static byte[] changeBytes(String value, boolean nullFlag) {
		return null;
	}

	/**
	 * Integerからbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static byte[] changeBytes(Integer value, boolean nullFlag) {
		return null;
	}

	/**
	 * Longからbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static byte[] changeBytes(Long value, boolean nullFlag) {
		return null;
	}

	/**
	 * BigDecimalからbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static byte[] changeBytes(BigDecimal value, boolean nullFlag) {
		return null;
	}

	/**
	 * byte[]からbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static byte[] changeBytes(byte[] value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value;
	}

	/**
	 * Dateからbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static byte[] changeBytes(Date value, boolean nullFlag) {
		return null;
	}

	/**
	 * Timeからbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static byte[] changeBytes(Time value, boolean nullFlag) {
		return null;
	}

	/**
	 * Timestampからbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static byte[] changeBytes(Timestamp value, boolean nullFlag) {
		return null;
	}

	/**
	 * Booleanからbyte[]への変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static byte[] changeBytes(Boolean value, boolean nullFlag) {
		return null;
	}

	/**
	 * StringからDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Date changeDate(String value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		try {
			return new Date((new SimpleDateFormat("yyyy/MM/dd")).parse(value).getTime());
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * IntegerからDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Date changeDate(Integer value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set(value / 10000, (value / 100) % 100 - 1, value % 100);
		return new Date(cal.getTimeInMillis());
	}

	/**
	 * LongからDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Date changeDate(Long value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set(value.intValue() / 10000, (value.intValue() / 100) % 100 - 1, value.intValue() % 100);
		return new Date(cal.getTimeInMillis());
	}

	/**
	 * BigDecimalからDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Date changeDate(BigDecimal value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set(value.intValue() / 10000, (value.intValue() / 100) % 100 - 1, value.intValue() % 100);
		return new Date(cal.getTimeInMillis());
	}

	/**
	 * byte[] からDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Date changeDate(byte[] value, boolean nullFlag) {
		return null;
	}

	/**
	 * DateからDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Date changeDate(Date value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value;
	}

	/**
	 * TimeからDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Date changeDate(Time value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return new Date(value.getTime());
	}

	/**
	 * TimestampからDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Date changeDate(Timestamp value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return new Date(value.getTime());
	}

	/**
	 * BooleanからDateへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Date changeDate(Boolean value, boolean nullFlag) {
		return null;
	}

	/**
	 * StringからTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Time changeTime(String value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		try {
			return new Time((new SimpleDateFormat("HH:mm:ss")).parse(value).getTime());
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * IntegerからTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Time changeTime(Integer value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set(Calendar.HOUR_OF_DAY, value / 10000);
		cal.set(Calendar.MINUTE, (value / 100) % 100);
		cal.set(Calendar.SECOND, value % 100);
		return new Time(cal.getTimeInMillis());
	}

	/**
	 * LongからTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Time changeTime(Long value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set(Calendar.HOUR_OF_DAY, value.intValue() / 10000);
		cal.set(Calendar.MINUTE, (value.intValue() / 100) % 100);
		cal.set(Calendar.SECOND, value.intValue() % 100);
		return new Time(cal.getTimeInMillis());
	}

	/**
	 * BigDecimalからTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Time changeTime(BigDecimal value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set(Calendar.HOUR_OF_DAY, value.intValue() / 10000);
		cal.set(Calendar.MINUTE, (value.intValue() / 100) % 100);
		cal.set(Calendar.SECOND, value.intValue() % 100);
		return new Time(cal.getTimeInMillis());
	}

	/**
	 * byte[] からTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Time changeTime(byte[] value, boolean nullFlag) {
		return null;
	}

	/**
	 * DateからTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Time changeTime(Date value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return new Time(value.getTime());
	}

	/**
	 * TimeからTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Time changeTime(Time value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value;
	}

	/**
	 * TimestampからTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Time changeTime(Timestamp value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return new Time(value.getTime());
	}

	/**
	 * BooleanからTimeへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Time changeTime(Boolean value, boolean nullFlag) {
		return null;
	}

	/**
	 * StringからTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(String value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		try {
			return new Timestamp((new SimpleDateFormat("yyyy/MM/dd HH:mm:ss.SSS")).parse(value).getTime());
		} catch (ParseException e) {
			return null;
		}
	}

	/**
	 * IntegerからTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(Integer value, boolean nullFlag) {
		return null;
	}

	/**
	 * LongからTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(Long value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set((int) (value.longValue() / 10000000000000L), (int) ((value.longValue() / 100000000000L) % 100) - 1,
				(int) ((value.longValue() / 1000000000L) % 100), (int) ((value.longValue() / 10000000L) % 100), (int) ((value
						.longValue() / 100000L) % 100), (int) ((value.longValue() / 1000L) % 100));
		cal.set(Calendar.MILLISECOND, (int) (value.longValue() % 1000));
		return new Timestamp(cal.getTimeInMillis());
	}

	/**
	 * BigDecimalからTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(BigDecimal value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		Calendar cal = Calendar.getInstance();
		cal.clear();
		cal.set((int) (value.longValue() / 10000000000000L), (int) ((value.longValue() / 100000000000L) % 100) - 1,
				(int) ((value.longValue() / 1000000000L) % 100), (int) ((value.longValue() / 10000000L) % 100), (int) ((value
						.longValue() / 100000L) % 100), (int) ((value.longValue() / 1000L) % 100));
		cal.set(Calendar.MILLISECOND, (int) (value.longValue() % 1000));
		return new Timestamp(cal.getTimeInMillis());
	}

	/**
	 * byte[] からTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(byte[] value, boolean nullFlag) {
		return null;
	}

	/**
	 * DateからTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(Date value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return new Timestamp(value.getTime());
	}

	/**
	 * TimeからTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(Time value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return new Timestamp(value.getTime());
	}

	/**
	 * TimestampからTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(Timestamp value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value;
	}

	/**
	 * BooleanからTimestampへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Timestamp changeTimestamp(Boolean value, boolean nullFlag) {
		return null;
	}

	/**
	 * StringからBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(String value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}

		return Boolean.parseBoolean(value);
	}

	/**
	 * IntegerからBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(Integer value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return new Boolean(value != 0);
	}

	/**
	 * LongからBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(Long value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return new Boolean(value != 0);
	}

	/**
	 * BigDecimalからBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(BigDecimal value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return new Boolean(value.compareTo(BigDecimal.ZERO) != 0);
	}

	/**
	 * byte[] からBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(byte[] value, boolean nullFlag) {
		return null;
	}

	/**
	 * DateからBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(Date value, boolean nullFlag) {
		return null;
	}

	/**
	 * TimeからBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(Time value, boolean nullFlag) {
		return null;
	}

	/**
	 * TimestampからBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(Timestamp value, boolean nullFlag) {
		return null;
	}

	/**
	 * BooleanからBooleanへの変換を行う
	 *
	 * @param value
	 *            変換元値
	 * @param boolean nullFlag 強制的に値をnullに変換する
	 * @return 変換された値
	 */
	public static Boolean changeBoolean(Boolean value, boolean nullFlag) {
		if (value == null || nullFlag) {
			return null;
		}
		return value;
	}

}
#!

#% === DAO Search Action =====================================================================
#! daoSearchAction package
package #package#;

#! daoSearchAction main
/**
 * レコード毎の処理インターフェース
 *
 * @author
 *
 */
public interface RecordAction {

	/**
	 * 初期化
	 *
	 * @throws Exception
	 */
	public void initAction() throws Exception;

	/**
	 * レコード毎に呼び出される処理
	 *
	 * @param record
	 *            処理を行うレコード
	 */
	public void action(Object record) throws Exception;

	/**
	 * 終了
	 *
	 * @throws Exception
	 */
	public void closeAction() throws Exception;
}
#!

#% === DAO Search Action =====================================================================
#! recordSearch package
package #package#;

#! recordSearch main
/**
 * レコード検索インターフェース
 *
 * @author
 *
 */
public interface RecordSearch {

	/**
	 * 以下の順番で処理を行う<br>
	 * 1.レコード毎の処理インターフェースオブジェクト#initActionを呼び出す<br>
	 * 2.レコードを検索し検索されたレコード毎にレコード毎の処理インターフェースオブジェクト#actionを呼び出す<br>
	 * 3.処理が終了したらレコード毎の処理インターフェースオブジェクト#closeActionを呼び出す
	 *
	 * @param searchAction
	 *            レコード毎の処理インターフェースオブジェクト
	 * @throws Exception
	 */
	public void search(RecordAction searchAction) throws Exception;

}
#!
