EntityManagerで更新系SQLをカスタマイズ
S2DaoでSQLを細かくカスタマイズしたい場合、AbstractDaoの継承クラスからEntityManagerを使用することになります。ただし、EntityManagerには検索系のメソッドしか用意されていないので、更新処理目的では使うことができません。
今回、更新用のSQLをカスタマイズする必要があったので、以下のようにEntityManagerとAbstractDaoを拡張しました。
- UpdatableEntityManager
package org.seasar.dao; public interface UpdatableEntityManager extends EntityManager { int update(String sql); int update(String sql, Object arg1); int update(String sql, Object arg1, Object arg2); int update(String sql, Object arg1, Object arg2, Object arg3); int update(String sql, Object[] args); }
- UpdatableEntityManagerImpl
package org.seasar.dao.impl; import org.seasar.dao.DaoMetaData; import org.seasar.dao.SqlCommand; import org.seasar.dao.UpdatableEntityManager; public class UpdatableEntityManagerImpl extends EntityManagerImpl implements UpdatableEntityManager { private DaoMetaDataImpl daoMetaDataImpl; public UpdatableEntityManagerImpl(DaoMetaData daoMetaData) { super(daoMetaData); daoMetaDataImpl = (DaoMetaDataImpl)daoMetaData; } public int update(String sql) { return update(sql, new Object[0]); } public int update(String sql, Object arg1) { return update(sql, new Object[] { arg1 }); } public int update(String sql, Object arg1, Object arg2) { return update(sql, new Object[] { arg1, arg2 }); } public int update(String sql, Object arg1, Object arg2, Object arg3) { return update(sql, new Object[] { arg1, arg2, arg3 }); } public int update(String sql, Object[] args) { SqlCommand command = createUpdateCommand(sql); Object result = command.execute(args); if(result instanceof Number) { return ((Number)result).intValue(); } else { return 0; } } private SqlCommand createUpdateCommand(String sql) { UpdateDynamicCommand command = new UpdateDynamicCommand( daoMetaDataImpl.dataSource, daoMetaDataImpl.statementFactory); command.setSql(sql); return command; } }
- UpdatableAbstractDao
package org.seasar.dao.impl; import org.seasar.dao.DaoMetaDataFactory; import org.seasar.dao.UpdatableEntityManager; public abstract class UpdatableAbstractDao extends AbstractDao { private UpdatableEntityManager updatableEntityManager; public UpdatableAbstractDao(DaoMetaDataFactory daoMetaDataFactory) { super(daoMetaDataFactory); updatableEntityManager = new UpdatableEntityManagerImpl( daoMetaDataFactory.getDaoMetaData(getClass())); } public UpdatableEntityManager getUpdatableEntityManager() { return updatableEntityManager; } }
UpdatableAbstractDaoを継承したDaoを作成し、getUpdatableEntityManager()を使用することで、更新処理が可能になります。