EntityManagerで更新系SQLをカスタマイズ

S2DaoSQLを細かくカスタマイズしたい場合、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()を使用することで、更新処理が可能になります。