/*
* Copyright 2004-2015 the Seasar Foundation and the Others.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied. See the License for the specific language
* governing permissions and limitations under the License.
*/
package org.seasar.extension.jdbc.query;
import java.util.Map;
import org.seasar.extension.jdbc.DbmsDialect;
import org.seasar.extension.jdbc.IterationCallback;
import org.seasar.extension.jdbc.ResultSetHandler;
import org.seasar.extension.jdbc.Select;
import org.seasar.extension.jdbc.ValueType;
import org.seasar.extension.jdbc.handler.BeanIterationResultSetHandler;
import org.seasar.extension.jdbc.handler.BeanListResultSetHandler;
import org.seasar.extension.jdbc.handler.BeanResultSetHandler;
import org.seasar.extension.jdbc.handler.MapIterationResultSetHandler;
import org.seasar.extension.jdbc.handler.MapListResultSetHandler;
import org.seasar.extension.jdbc.handler.MapResultSetHandler;
import org.seasar.extension.jdbc.handler.ObjectIterationResultSetHandler;
import org.seasar.extension.jdbc.handler.ObjectListResultSetHandler;
import org.seasar.extension.jdbc.handler.ObjectResultSetHandler;
import org.seasar.extension.jdbc.manager.JdbcManagerImplementor;
import org.seasar.extension.jdbc.types.ValueTypes;
import org.seasar.framework.convention.PersistenceConvention;
/**
* SQLをあつかう検索用の抽象クラスです。
*
* @author higa
* @param <T>
* 戻り値のベースの型です。
* @param <S>
* <code>Select</code>のサブタイプです。
*/
public abstract class AbstractSqlSelect<T, S extends Select<T, S>> extends
AbstractSelect<T, S> implements Select<T, S> {
/**
* {@link AbstractSqlSelect}を作成します。
*
* @param jdbcManager
* 内部的なJDBCマネージャ
* @param baseClass
* ベースクラス
*/
public AbstractSqlSelect(JdbcManagerImplementor jdbcManager,
Class<T> baseClass) {
super(jdbcManager, baseClass);
}
@SuppressWarnings("unchecked")
@Override
protected ResultSetHandler createResultListResultSetHandler() {
DbmsDialect dialect = jdbcManager.getDialect();
PersistenceConvention persistenceConvention = jdbcManager
.getPersistenceConvention();
boolean simple = ValueTypes.isSimpleType(baseClass);
ValueType valueType = simple ? getValueType(baseClass, resultLob,
resultTemporalType) : null;
if (simple) {
return new ObjectListResultSetHandler(valueType, limit);
}
if (Map.class.isAssignableFrom(baseClass)) {
return new MapListResultSetHandler(
(Class<? extends Map>) baseClass, dialect,
persistenceConvention, executedSql, limit);
}
return new BeanListResultSetHandler(baseClass, dialect,
persistenceConvention, executedSql, limit);
}
@SuppressWarnings("unchecked")
@Override
protected ResultSetHandler createSingleResultResultSetHandler() {
DbmsDialect dialect = jdbcManager.getDialect();
PersistenceConvention persistenceConvention = jdbcManager
.getPersistenceConvention();
if (ValueTypes.isSimpleType(baseClass)) {
ValueType valueType = getValueType(baseClass, resultLob,
resultTemporalType);
return new ObjectResultSetHandler(valueType, executedSql);
}
if (Map.class.isAssignableFrom(baseClass)) {
return new MapResultSetHandler((Class<? extends Map>) baseClass,
dialect, persistenceConvention, executedSql);
}
return new BeanResultSetHandler(baseClass, dialect,
persistenceConvention, executedSql);
}
@SuppressWarnings("unchecked")
@Override
protected ResultSetHandler createIterateResultSetHandler(
final IterationCallback<T, ?> callback) {
final DbmsDialect dialect = jdbcManager.getDialect();
final PersistenceConvention persistenceConvention = jdbcManager
.getPersistenceConvention();
final boolean simple = ValueTypes.isSimpleType(baseClass);
final ValueType valueType = simple ? getValueType(baseClass, resultLob,
resultTemporalType) : null;
if (simple) {
return new ObjectIterationResultSetHandler(valueType, limit,
callback);
}
if (Map.class.isAssignableFrom(baseClass)) {
return new MapIterationResultSetHandler(
(Class<? extends Map>) baseClass, dialect,
persistenceConvention, executedSql, limit, callback);
}
return new BeanIterationResultSetHandler(baseClass, dialect,
persistenceConvention, executedSql, limit, callback);
}
/**
* 件数取得用SQLに変換します。
*
* @param sql
* SQL
* @return 件数取得用SQL
* @see DbmsDialect#convertGetCountSql(String)
*/
protected String convertGetCountSql(final String sql) {
return jdbcManager.getDialect().convertGetCountSql(sql);
}
}