package com.android_mvc.framework.db.dao; import java.util.List; import com.android_mvc.framework.common.FWUtil; import com.android_mvc.framework.db.DBHelper; import com.android_mvc.framework.db.entity.BaseLogicalEntity; /** * DAOの基底クラス。 * @author id:language_and_engineering */ public class BaseDAO<T extends BaseLogicalEntity<T>> { protected DBHelper helper = null; /** * レコードを全て新しい順に返す。 */ public List<T> findAll(DBHelper helper, Class<T> entity_class) { // 有効な主キーを持つ全件を降順に return new Finder<T>(helper) .where("id > 0") .orderBy("id DESC") .findAll(entity_class) ; } /** * idが最新の1件を取得する。 */ public T findNewestOne(DBHelper helper, Class<T> entity_class) { List<T> records = new Finder<T>(helper) .where("id > 0") .orderBy("id DESC") .offset(1) .limit(1) .findAll(entity_class) ; if( records.size() > 0 ) { return records.get(0); } else { return null; } } /** * レコードを主キーから1件取得する。 */ public T findById(DBHelper helper, Class<T> entity_class, Long record_id) { // 特定のIDを持つレコード List<T> result = new Finder<T>(helper) .where("id = " + record_id.toString()) .findAll(entity_class) ; if( result.size() > 0 ) { return result.get(0); } else { FWUtil.w("検索結果がヒットしませんでした。id = " + record_id.toString()); return null; } } // 以下は内部的な事情でもがいた残骸 /* TODO: find系のメソッドでgetConcreteGenericType()しても,返却値は下記のようになってしまう。子クラスが取れず。orz 07-26 15:32:32.515: DEBUG/android-mvc-sample(3191): エンティティクラスの型:com.android_mvc.framework.db.entity.BaseLogicalEntity 07-26 15:32:32.525: DEBUG/android-mvc-sample(3191): com.android_mvc.framework.db.dao.Finder#findAll : 07-26 15:32:32.525: DEBUG/android-mvc-sample(3191): DB接続をオープンします。 07-26 15:32:32.525: ERROR/android-mvc-sample(3191): java.lang.InstantiationException: com.android_mvc.framework.db.entity.BaseLogicalEntity */ /** * このクラスに渡された型パラメータTの具体的なClass情報を返却する。 */ /* protected Class<T> getConcreteGenericType() { // 下記は引数なしで呼んでいるのがポイント @SuppressWarnings("unchecked") Class<T> entity_class = getConcreteGenericTypeByTrickyWay(); return entity_class; } */ /** * このクラスに渡された型パラメータTの具体的なClass情報を,裏技的に返却するための仕掛け。 * 可変長引数で定義してあるのがミソ。 */ /* private Class<T> getConcreteGenericTypeByTrickyWay(T... dummyParam) { // NOTE: このメソッドは,引数なしで呼び出す。 // 呼び出し側では「総称配列は可変引数パラメーターに対して作成されます」の警告が出るので // @SuppressWarnings("unchecked")を付与する。 // この対処はFW内のみで済むため,ユーザにアノテーションを書かせなくて済む。 @SuppressWarnings("unchecked") Class<T> type = (Class<T>) dummyParam.getClass().getComponentType(); FWUtil.d("エンティティクラスの型:" + type.getName()); return type; // Credit: // This method was realized by the courtesy of 「Java変態文法最速マスター」 // http://d.hatena.ne.jp/Nagise/20100202/1265131791 // http://d.hatena.ne.jp/language_and_engineering/20120502/p1 } */ }