4

任意の SQL クライアントを介して以下を実行する

SELECT FALSE, TRUE;

戻り値

f, t

ただし、この SQL クエリ:

SQLQuery qry = session.createSQLQuery("SELECT FALSE, TRUE;");
Object[] result = (Object[]) qry.uniqueResult();

2 つの Boolean オブジェクトを含む Object 配列を返します。

[false, false]

休止状態で postgres 9.0-801.jdbc4 を使用しています。

休止状態の SQL クエリを介して適切なブール値を返すにはどうすればよいですか?

4

1 に答える 1

3

マッピング ファイル内のブール プロパティの定義を変更してみてください。

<property name="someBoolean" column="SOME_COLUMN" type="true_false"></property>

または、注釈を使用している場合は、これを追加します。

@Type(type="true_false")

デフォルトでは、hibernate は boolean プロパティを CHAR(1) ではなく BIT としてマップするため、これが役立つはずです。そのため、このような問題が発生していると思います。( hibernate mapping typesを見てください)。

編集:

SQLQuery を使用してブール値を選択する必要がある場合 (エンティティのフィールドとしてではなく、分離された値として)、次のようなアプローチを使用できます。

SQLQuery q = session.createSQLQuery("SELECT FALSE a, TRUE b;");
q.addScalar("a", new TrueFalseType());
q.addScalar("b", new TrueFalseType());

Object[] result = (Object[]) q.uniqueResult();

この場合に見られるように、取得した値の型を明示的に定義して、hibernate が正しく変換できるようにする必要があります。私はこのアプローチを MySQL でテストしましたが、すべてが機能しています ( MySQL はブール値を 1/0 として扱うため、私の場合は型BooleanType()を指定したことを除いて)。

Hibernate は 3 つのブール形式を使用します。

1) "Y/N" -> CHAR(1) ansi sql タイプ -> "yes_no" hibernate タイプ -> YesNoType クラス;

2) "T/F" -> CHAR(1) -> "true_false" hibernate タイプ -> TrueFalseType クラス;

3) "1/0" -> BIT ansi sql タイプ -> "boolean" hibernate タイプ -> BooleanType クラス。

そのため、DB の正しい型を選択する必要があります (私が理解し、例で書いたように、TrueFalseTypeを使用する必要があります)。

于 2012-08-05T07:09:10.247 に答える