(外だしSQL)selectEntity()

"外だしSQLの使い方" を既に読んでいることが前提となります。

概要

外だしSQLで null を戻す可能性のある一件検索 をします。検索結果が存在する場合としない場合で業務的な処理を分岐させる必要があるような場合に利用します。

検索結果が存在しなかったら例外になってもいい(それは何かの間違い、もしくは、すれ違いによる削除)、という場合は、このメソッドではなく selectEntityWithDeletedCheck() を利用して下さい。

会話上では、(外だしSQLの)せれくとえんてぃてぃ と表現します。

実装方法

メソッドの呼び出し ※1.1.x (Java8版)

outsideSql() の後、selectEntity() を呼び出します。

e.g. 外だしSQLの一件検索の実装手順 (Eclipseでコード補完) @Java
memberBhv.o // .o と打って enter
--
memberBhv.outsideSql().selEn // .selEn と打って enter
--
// 戻り値は OptionaEntity なので、ConditionBeanの selectEntity() と同じように、
// ifPresent(), alwaysPresent(), orElseTranslatingThrow() などを利用
memberBhv.outsideSql().selectEntity(pmb);

メソッドはオーバーロードで "定型呼び出し形式" と "フリースタイル形式" と二つあります。

メソッドの呼び出し ※1.0.x (Java6版)

outsideSql() の後、entityHandling() を呼び出し、その後 selectEntity() を呼び出します。

e.g. 外だしSQLの一件検索の実装手順 (Eclipseでコード補完) @Java
memberBhv.o // .o と打って enter
--
memberBhv.outsideSql().en // .en と打って enter
--
memberBhv.outsideSql().entityHandling().selE // .selE と打って enter
--
memberBhv.outsideSql().entityHandling().selectEntity(pmb);

定型呼び出し形式

TypedParameterBean を引数に受け取ります。(null は許可されません)

CustomizeEntityマーク、および、ParameterBeanマークが定義されていることで TypedParameterBean の定型呼び出しが利用できます。この場合、ページング検索やカーソル検索に型付けされたSQLも含まれます。

フリースタイル形式

パス、パラメータ(ParameterBean)、戻り値Entityの型の三つの要素を引数に受け取ります。 それぞれフリースタイル形式の基本仕様と全く同じです。

外だしSQLの使い方 - フリースタイル基本仕様

検索結果の受け取り

検索結果は、TypedParameterBean に関連付けられている Entity 型、もしくは、第三引数で指定した Entity 型のインスタンスを戻り値として受け取ります。

e.g. 外だしSQLの一件検索の実装 @Java
SimpleMemberPmb pmb = new SimpleMemberPmb();
pmb.setMemberId(3);
SimpleMember member = 
    memberBhv.outsideSql().selectEntity(pmb);
if (member != null) { 
    ... // 存在した場合の処理
} else {
    ... // 存在しなかった場合の処理
}

スカラ型で受け取る

SQL上の select 句のカラムを一つにして、検索結果を String や Integer などのスカラ値(スカラ型)のリストで受け取ることも可能です。TypedParameterBean ではCustomizeEntityマークに加えて scalar オプションを付与します。

検索件数の取得 "select count(*)" や最大値の取得 "select max(xxx)" などにおいて有効です。

e.g. スカラ型のオプションを指定 {MemberBhv_selectMemberCount.sql} @SQL-File
-- #df:entity#
-- +scalar+
select count(*)
  from MEMBER
e.g. 文字列のスカラ値のリストを検索 @Java
MemberCountPmb pmb = new MemberCountPmb();
Integer count = 
    memberBhv.outsideSql().selectEntity(pmb)

スカラ値での検索においても、検索結果がない場合の扱いについては全く同じです。

なぜ、一歩手順が多いの?

こちら、1.0.x (Java6版) での話です。1.1.x では結局フラットにしました...

selectList()とは並ばず、entityHandling()って一歩進めないといけない外だしSQLの一件検索。 なぜかと言うと、ズバリ、(作者の経験上)実務的に外だしSQLのほとんどがリスト検索になりやすいと判断したからです。DBFluteには強力な ConditionBean があるため、特に一件検索はほとんどCBで実装できることが多いためです。その分、外だしSQLのリスト検索は outsideSql() の後に、唯一の "s" で始まるメソッドしてコード補完しやすくなっています。