EJB 照会のデータ型操作の規則
Enterprise JavaBeans (EJB) 照会を使用して データ型を処理する場合は、 一定の規則に従う必要があります。
いずれの型の CMP フィールドも SELECT 文節では使用できます。 ただし、検索条件およびグループ化または順序付け操作で、以下の型のみのフィールドを使用する必要があります。
- プリミティブ型: byte、short、int、long、float、double、boolean、char
- オブジェクト型: Byte、Short、Integer、Long、Float、Double、BigDecimal、String、 Boolean、Character、java.util.Calendar、java.util.Date
- JDBC 型: java.sql.Date、java.sql.Time、java.sql.Timestamp
- バイナリー・ストリング: byte
- 上記でリストされた基本型の 1 つの CMP フィールドが、コンバーターを使用して SQL 列にマップされる
- CMP フィールドが基本述部の前にある
- この述部の後にリテラルまたは入力パラメーターがある
例えば、整数値 10 をストリング値「Ten」にマップするコンバーターの場合、EJB 照会は以下のようになります。
e.cmp = 10
次の SQL 照会に変換されます。
column = 'Ten'
さらに複雑な述部を組み込むと、以下の例のようになります。
e.cmp * 10 > e.salary
finder または select 照会では、「照会のプッシュダウンができません」というエラー・メッセージを受け取ります。 このような多機能照会には動的 EJB 照会サービスを使用します。動的照会ランタイムはアプリケーション・サーバーで述部を処理します。
全体的に、コンバーターは、等価性、照合シーケンス、およびヌル値を保存します。 コンバーターがこれらの要件に適合しない場合は、CMP フィールド比較演算に使用しないでください。
ユーザー型は比較演算または式に使用することができません。ただし、パス式にはユーザー型のサブ フィールドを使用することができます。 例えば、型が com.exam.Address である CMP addr フィールド、および番地、市区町村、および都道府県のサブフィールドを想定します。 この CMP フィールドの照会の以下の構文は無効です。
e.addr = ?1
ただし、サブフィールドの 1 つを指定する照会は有効です。
e.addr.street = ?1
CMP フィールドは、Java シリアライゼーションを使用して SQL 列にマップできます。 通常、デプロイメント照会用の述部または式に CMP フィールドを使用することで、「照会のプッシュダウンができません」というエラー・メッセージが発生します。 動的照会ランタイムは、アプリケーション・サーバーでユーザー型のインスタンスすべてを読み取り、デシリアライズして、式を処理します。
ただし、この処理は負荷が高く、パフォーマンスが犠牲になります。 デプロイメント EJB 照会では、 コンポーザーを使用してパフォーマンスを維持することができます。 先の例では、バイナリー形式に addr フィールドをマップする場合、コンポーザーを使用して、各サブフィールドをデータベースのバイナリー列にマップします。