条件コメント
ifとend
条件分岐を示す式コメントを条件コメントと呼びます。
構文は、次のとおりです。
/*%if 条件式*/ ~ /*%end*/
条件式は、結果がbooleanもしくはjava.lang.Boolean型と評価される式でなければいけません。
例を示します。
select * from employee where
/*%if employeeId != null */
employee_id = /* employeeId */99
/*%end*/
上記のSQL文は、 employeeIdが nullでない場合 次のような準備された文に変換されます。
select * from employee where employee_id = ?
このSQL文は、 employeeIdがnullの場合に次のような準備された文に変換されます。
select * from employee
ifの条件が成り立たない場合にifの外にあるWHERE句が出力されないのは、WHEREや HAVINGの自動除去機能が働いているためです。
条件コメントにおけるWHEREやHAVINGの自動除去
条件コメントを使用した場合、条件の前にあるWHEREやHAVINGについて、自動で出力の要/不要を判定します。
たとえば、次のようなSQLでemployeeIdが nullの場合、
select * from employee where
/*%if employeeId != null */
employee_id = /* employeeId */99
/*%end*/
/*%if ~*/の前の whereは自動で除去され、次のSQLが生成されます。
select * from employee
条件コメントにおけるANDやORの自動除去
条件コメントを使用した場合、条件の後ろにつづくANDやORについて、自動で出力の要/不要を判定します。
たとえば、次のようなSQLでemployeeIdが nullの場合、
select * from employee where
/*%if employeeId != null */
employee_id = /* employeeId */99
/*%end*/
and employeeName like 's%'
/*%end*/の後ろの and は自動で除去され、次のSQLが生成されます。
select * from employee where employeeName like 's%'
elseifとelse
/*%if 条件式*/ と /*%end*/ の間では、
elseifやelseを表す次の構文も使用できます。
/*%elseif 条件式*/
/*%else*/
例を示します。
select
*
from
employee
where
/*%if employeeId != null */
employee_id = /* employeeId */9999
/*%elseif department_id != null */
and
department_id = /* departmentId */99
/*%else*/
and
department_id is null
/*%end*/
上のSQLは、employeeId != null が成立するとき実際は次のSQLに変換されます。
select
*
from
employee
where
employee_id = ?
employeeId == null && department_id != null が成立するとき、実際は次のSQLに変換されます。
department_idの直前のANDは自動で除去されるため出力されません。
select
*
from
employee
where
department_id = ?
employeeId == null && department_id == null が成立するとき、実際は次のSQLに変換されます。
department_idの直前のANDは自動で除去されるため出力されません。
select
*
from
employee
where
department_id is null
過去との互換性のため、/*%if 条件式*/ と /*%end*/ の間では、
行コメントを使用した次の構文も使用できます。
特に理由がない限り、ブロックコメントの /*%elseif 条件式*/ や /*%else*/ を使用してください。
--elseif 条件式--
--else
elseifやelseを行コメントで表した場合の例を示します。
select
*
from
employee
where
/*%if employeeId != null */
employee_id = /* employeeId */9999
--elseif department_id != null -- department_id = /* departmentId */99
--else department_id is null
/*%end */
ネストした条件コメント
条件コメントはネストさせることができます。
select * from employee where
/*%if employeeId != null */
employee_id = /* employeeId */99
/*%if employeeName != null */
and
employee_name = /* employeeName */'hoge'
/*%else*/
and
employee_name is null
/*%end*/
/*%end*/
条件コメントにおける制約
条件コメントのifとendはSQLの同じ節に含まれなければいけません。
節とは、SELECT節、FROM節、WHERE節、GROUP BY節、HAVING節、ORDER BY節などです。
次の例では、ifがFROM節にありendがWHERE節にあるため不正です。
select * from employee /*%if employeeId != null */
where employee_id = /* employeeId */99 /*%end*/
また、ifとendは同じレベルの文に含まれなければいけません。
次の例では、ifが括弧の外にありendが括弧の内側にあるので不正です。
select * from employee
where employee_id in /*%if departmentId != null */(... /*%end*/ ...)