【SalesForceメモ】APEX内でのsoql組み立て方


# SalesForce個人用メモ
SalesForceは基本的に癖が強いので、
個人的に覚えておきたいことをメモしていく。
<font color="#1e90ff">**要はQiitaはメモ代わり**</font>

今回は<font color="#1e90ff">**String型**</font>と<font color="#1e90ff">**Object型**</font>（SalesForceで使う特殊な型）で
定義された変数にSOQLの式を格納する際の

## APEXで記述する際のSOQLの組み立て方（String型に格納する場合）。
String型の変数にSOQLを格納する際の注意点
SOQLは文字列で記述するが、文字列内で空白が適用されるため注意

```apex

//TestObject（オブジェクト）
//TestColumn1__c（オブジェクトの項目）
//TestColumn2__c（オブジェクトの項目）
//TestColumn3__c（オブジェクトの項目）
//variable（バインド変数）

//【正】
-----------------------------------------------------------------------
String soql = 'SELECT id, name, TestColumn1__c, TestColumn2__c,TestColumn3__c FROM TestObject WHERE TestColumn3__c=' + variable;
-----------------------------------------------------------------------
String soql = 'SELECT id, Name, TestColumn1__c, TestColumn2__c,'
soql = soql + ' TestColumn3__c FROM TestObject WHERE TestColumn3__c=' + variable;
-----------------------------------------------------------------------
//【誤】
/*
*１：項目名と項目名の間に「,」がない
*２：FROM句やSELECTなどの指定句と項目名との間に空白がない
*３：句は大文字小文字の区別なし
*/
-----------------------------------------------------------------------
String soql = 'SELECT id, nameTestColumn1__c, TestColumn2__c, TestColumn3__cFROM　TestObject WHERE TestColumn3__c=' + variable;
-----------------------------------------------------------------------
//TestColumn3__cの前に空白が存在していない
String soql = 'SELECT id, name, TestColumn1__c, TestColumn2__c,'
soql = soql + 'TestColumn3__c FROM TestObject WHERE TestColumn3__c=' + variable;

```

## APEXで記述する際のSOQLの組み立て方（Object型に格納する場合）。
Object型の変数にSOQLを格納する際の注意点
String型と同じく文字列を記述するが、エディタツールによっては見た目の見易さや、
そもそも文字列型と書き方が異なる部分ありありのあり。

```apex
//TestObject（オブジェクト）
//TestColumn1__c（オブジェクトの項目）
//TestColumn2__c（オブジェクトの項目）
//TestColumn3__c（オブジェクトの項目）
//variable（バインド変数）

//【正】
-----------------------------------------------------------------------
TestObject tst = [SELECT id, Name, TestColumn1__c,TestColumn2__c,TestColumn3__c FROM TestObject];
TestObject tst = [SELECT id, Name, TestColumn1__c,TestColumn2__c,TestColumn3__c FROM TestObject WHERE TestColumn3__c = :variable];

//文字列と異なり、コード内での改行は可能
TestObject tst = [SELECT id, Name, 
                  TestColumn1__c,TestColumn2__c,TestColumn3__c 
                  FROM TestObject WHERE TestColumn3__c = :variable];
-----------------------------------------------------------------------
//【誤】
/*
*１：項目名と項目名の間に「,」がない
*２：FROM句やSELECTなどの指定句と項目名との間に空白がない
*３：句は大文字小文字の区別なしだが、エディタツールによって色が変化するので
　　 何かこだわりがない限り大文字で句を記述する
*４：バインド変数を条件式に加える場合は「+」は使用しない
*/
-----------------------------------------------------------------------
TestObject tst = [SELECTid, Name, TestColumn1__c,TestColumn2__cTestColumn3__c FROM TestObject WHERE TestColumn3__c = + variable];
-----------------------------------------------------------------------
```

## 動的SOQLに直接ぶち込むパターン
例に出したやり方がありますので、無理にこちらを使う必要はないと思います。
むしろ例の方が安全なので「良く分からない…」「とりあえず例が使えるなら…」
と考えている方は暇があれば下記の記事を見てみてください。

将来的に動的SOQLを使用する場面も出てくると思いますので、
その時に理解して使ってみてください。

まずは下記の記事ですが、
<font color="#ff0000">**SOQLインジェクション（俗に言うSQLインジェクションとかあれと同じ）**</font>が起こる可能性がある。とか
また視覚的に見にくいとかエディタで確認するときにめんどくさいとか色々理由があるため、
使わない方が得策だよ。っていう記事です

https://qiita.com/kaku10/items/b1d60728a3a4b7c8bfc6


そして下記の記事ですが、
使うんだったらこんな感じで使えば言いよって言うのをまとめている記事になります。

https://qiita.com/TomoShiozawa/items/30fbe09e9974624fddbe

＊@skussun1 さんありがとうございました。＊

## まとめ
調べても以外としっかり記述しているところがないので作成しました。
追記するとしたらテストクラスではどんな感じでテストするのか書きたいですね。