Fork me on GitHub

SalesforceClient Sample

SQLライクな更新

基本的な使い方

SQLライクなinsert/update/upsert/delete文を使用してオブジェクトを更新することができます。

JDBCと同様に「?」をパラメータとして埋め込むことができます。

SalesforceClient client;
DmlResult result = client.executeUpdate("INSERT INTO Account (Name, ExId__c) VALUES(?, ?)", "hoge", "fuga");
System.out.println("Success=" + result.getSuccessCount() + ", Error=" + result.getErrorCount());

内部的には構文をパースしてcreateやupdateメソッドを組み立てて実行しているだけです。

INSERT構文

insert into <OBJECT> (<COL>, ...) values (....)[, (...)]*
insert into <OBJECT> (<COL>, ...) select ...

insert-selectでは先にqueryを実行してその結果を元にcreateメソッドを組み立てます。

UPDATE構文

update <OBJECT> set <COL> = ...[, <COL> = ...] [where ...]

UPDATE文では最初にWHERE句の条件で「SELECT Id FROM xxx WHERE ....」というクエリを実行し、その結果セットに対してupdateを実行します。
このため「UPDATE ... WHERE ID = ?」という構文はIDがわかっているにも関わらずIDのSELECTが実行されるため非効率です。
あらかじめIDの分かっているオブジェクトの更新の場合は素直にupdateメソッドを使用する方が高速です。
(ID SELECTのコスト以外にもUPDATE文自体の構文解析にもコストがかかります。)

UPSERT構文

upsert into <OBJECT> (<COL>, ...) [externalId <COL>] values (....)[, (...)]*
upsert into <OBJECT> (<COL>, ...) [externalId <COL>] select ...

externalIdが省略された場合は更新対象列の中から外部IDが選択されます。

更新フィールド中に外部IDフィールドが含まれていない場合はエラーになります。

DELETE構文

delete from <OBJECT> [where ...]

UPDATE文の場合と同様WHERE句がID指定のみの場合は既にわかっているはずのID SELECTが実行されるため非効率です。

当然ですがWHERE句なしでDELETE文を実行すると全オブジェクトが削除されるので注意してください。
(Salesforceのごみ箱から復活させることはできますが。。。)