概要
SOQL上では"Select *"がないので、実装してみました。使う時に注意事項をご確認ください。
多分すでに実装した方はいらっしゃると思いますので、ネタがかぶったら申し訳ありません。
目的
全項目をクエリする時に、いちいち項目を指定するのが面倒な方にはぴったりです。
実装
/**
* SOQLの"Select *"のクエリStringを取得する
* @param tableName テーブル名
* @param whereCondition クエリのWHEREやGROUPBYやORDERBYやLIMITなど
* @param isCustomFieldOnly カスタム項目のみを取得するフラグ
* @param staticFields カスタム項目のみの場合、カスタム項目をクエリに含めたらこのパラメーターを使用する
* @return SOQLクエリString
**/
public static String getSelectAllQuery(String tableName, String whereCondition, Boolean isCustomFieldOnly, String[] staticFields) {
Map<String, Schema.SObjectType> m = Schema.getGlobalDescribe() ;
Schema.SObjectType s = m.get(tableName) ;
Schema.DescribeSObjectResult r = s.getDescribe() ;
Map<String, Schema.SObjectField> fields = r.fields.getMap() ;
string soql = '';
for (String fieldName : fields.keyset()) {
if(isCustomFieldOnly && (fieldName.indexOf('__c') < 0)) {
continue;
}
if (soql != '') {
soql += ', ';
}
soql += fieldName;
}
for (String fieldName : staticFields) {
if (soql != '') {
soql += ', ';
}
soql += fieldName;
}
soql = 'SELECT ' + soql + ' FROM ' + tableName + ' ' + whereCondition;
return soql;
}
- staticFieldsパラメータについて
カスタム項目のみのクエリを生成する際に、いくつか標準項目も取得したい場合使用することができます。
使い方
- 全項目
String query = getSelectAllQuery('Account', 'WHERE Id=\''+accId+'\'', false, null);
Account accData = Database.query(query);
- カスタム項目のみ
String[] fields = new String[]{'Name'};
String query = getSelectAllQuery('Account', 'WHERE Id=\''+accId+'\'', true, fields);
Account accData = Database.query(query);
注意事項
全項目をコピ・クローンーするなどの目的では、数式型かどうかや権限も持っているをちゃんとチェックしてください。