3

このJPQLクエリを実行しようとしています:

SELECT DISTINCT i FROM Table i JOIN i.other o

これはすぐに失敗します:

「内部例外: java.sql.SQLException: タイプ 'BLOB' の列は、そのタイプの比較がサポートされていないため、CREATE INDEX、ORDER BY、GROUP BY、UNION、INTERSECT、EXCEPT、または DISTINCT ステートメントでは使用できません。」

このエラーは私には理にかなっていますが、どうすれば回避できますか?

4

4 に答える 4

3

BLOB オブジェクトのハッシュまたはチェックサムを別の列に格納し、その上で個別の演算子を使用できます。

例:

SELECT i from Table  WHERE id IN (
  SELECT id FROM (
    SELECT MIN(id) AS id, hash_of_i FROM Table GROUP BY hash_of_i
                 ) t
                                )

この SQL はもっとエレガントに書けると思いますが、アイデアが得られるでしょう。

編集 - これを使用すると、 Distinct 演算子を完全に省略できることに気付きました (削除するだけで機能的に同等になります)。

編集 2 - 最初のバージョンが機能したかどうかわからないので、書き直しました

于 2009-01-26T16:16:59.510 に答える
2

HermanD からインスピレーションを得て、次の実用的なソリューションにたどり着きました。

SELECT i FROM Table i WHERE EXISTS (
    SELECT e FROM Table e JOIN e.other o WHERE e.id=i.id
)
于 2009-01-26T17:10:01.803 に答える
0

クエリで、distinct の代わりに setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY) を使用します。

于 2015-02-14T17:43:59.030 に答える
0

BLOB 型の列の値は、実際のデータ ストレージへのポインターにすぎません。これらの演算子のいずれかを適用するには、BLOB からデータをロードし、独自のロジックを実装する必要があります。これは、データがあらゆるもの (画像、テキストなど) を表すことができるためです。

于 2009-01-26T16:18:14.920 に答える