2017-11-24 5 views
0

Objectタイプのインデックスはどのように使用できますか?Apache Igniteインデックスフィールドのオブジェクトタイプが

私のモデル持っている1つのインデックスフィールド

public class Model implements Serializable { 
     ...... 
     ..... 
    @QuerySqlField(index = true) 
    private Object sortField; 
    } 

次のコマンド作品は

cache.query(new SqlQuery<>(Model.class, "ORDER BY sortField")).getAll(); 

をproperly-しかし、私は例えば、いくつかのフィルタリングをしたいとき:

cache.query(new SqlQuery<>(Model.class, "sortField= ?").setArgs(10)).getAll(); 

それはもたらします次のようになります。CacheExceptionFailed to run map query remotely

ObjectIntegerに変更すると、すべて正常に動作します。

しかし、なぜORDER BYが機能するのかわかりませんが、WHEREObjectフィールドではありません。あなたが見ることができます詳細については

http://apache-ignite-users.70518.x6.nabble.com/Cache-queries-Failed-to-run-map-query-remotely-td18378.html

答えて

3

さて、ここで学ぶべき教訓は、フィールドタイプとしてオブジェクトを使うべきではないということです:)

私はコードを見て、そうしたときそれは、値はいくつかの "16進文字列"として扱われます。だから、あなたが「オーダー・バイ・バイ・バイ・オーダー」するとき、実際にはストアド・バリューのバイナリ表現をソートしていると思います。明らかにすべてのタイプで正しく動作するわけではありませんが、何らかの理由でH2(これはIgniteの基礎となるSQLエンジンです)です。

また、 "where"句を使用してフィルタを実行しようとすると、指定した引数が "16進数"の文字列として扱われ、 "10"が正しいhexadiamal表現ではないため失敗します任意のオブジェクトの。

私は全体の手順の詳細には実際には行きませんでしたが、私はあなたがその考えを得ることを願っています。

したがって、フィールドに整数を格納する場合は、Integerまたはintと宣言してください。

関連する問題