0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2022-10-17

SalesForce個人用メモ

SalesForceは基本的に癖が強いので、
個人的に覚えておきたいことをメモしていく。
要はQiitaはメモ代わり

今回はString型Object型(SalesForceで使う特殊な型)で
定義された変数にSOQLの式を格納する際の

APEXで記述する際のSOQLの組み立て方(String型に格納する場合)。

String型の変数にSOQLを格納する際の注意点
SOQLは文字列で記述するが、文字列内で空白が適用されるため注意


//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;
-----------------------------------------------------------------------
//【誤】
/*
*1:項目名と項目名の間に「,」がない
*2:FROM句やSELECTなどの指定句と項目名との間に空白がない
*3:句は大文字小文字の区別なし
*/
-----------------------------------------------------------------------
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型と同じく文字列を記述するが、エディタツールによっては見た目の見易さや、
そもそも文字列型と書き方が異なる部分ありありのあり。

//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];
-----------------------------------------------------------------------
//【誤】
/*
*1:項目名と項目名の間に「,」がない
*2:FROM句やSELECTなどの指定句と項目名との間に空白がない
*3:句は大文字小文字の区別なしだが、エディタツールによって色が変化するので
   何かこだわりがない限り大文字で句を記述する
*4:バインド変数を条件式に加える場合は「+」は使用しない
*/
-----------------------------------------------------------------------
TestObject tst = [SELECTid, Name, TestColumn1__c,TestColumn2__cTestColumn3__c FROM TestObject WHERE TestColumn3__c = + variable];
-----------------------------------------------------------------------

動的SOQLに直接ぶち込むパターン

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

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

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

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

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

まとめ

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

0
0
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?