2017-04-04 14 views
1

プライマリキーとして使用したクラスの特定のプロパティを何らかの方法でクエリできるかどうかは疑問です。 私の考えは、以下のコードのようなものでした。 _key.NAMEで、私はあまりにもTestOjectPK.NAMEてみましたが、成功せず、私が受信したエラーメッセージはカラムが存在しないと言って:Apache Igniteプライマリキーで構成されたSQLクエリ

var fieldsQuery = new SqlFieldsQuery("select _val,_key from TestObject where _key.NAME= ? and VALUE= ?", "name1","value"); 
IQueryCursor<IList> queryCursor = cache.QueryFields(fieldsQuery); 

これは3列、それらの2と一定のテーブルを表現するために私のクラスですPKです。

class TestObjectPK : IBinarizable 
{ 
    private Int32 id; 
    private String name; 

    [QuerySqlField] 
    public string NAME 
    { 
     get{return this.name;} 
     set{this.name = value;} 
    } 

    [QuerySqlField] 
    public Int32 ID 
    { 
     get{return this.id;} 
     set{this.id = value;} 
    } 

    public void WriteBinary(IBinaryWriter writer) 
    { 
     writer.WriteInt("ID", ID); 
     writer.WriteString("NAME", NAME); 
    } 

    public void ReadBinary(IBinaryReader reader) 
    { 
     ID = reader.ReadInt("ID"); 
     NAME = reader.ReadString("NAME"); 
    } 

    public override int GetHashCode() 
    { 
     return id.GetHashCode() + name.GetHashCode(); 
    } 

    public override bool Equals(object obj) 
    { 
     return id == ((TestObjectPK)obj).id && name == ((TestObjectPK)obj).NAME; 
    } 
} 


class TestObject : IBinarizable 
{ 
    private String value2; 
    [QuerySqlField] 
    public String VALUE 
    { 
     get { return this.value2; } 
     set { this.value2 = value; } 
    } 


    public void WriteBinary(IBinaryWriter writer) 
    { 
     writer.WriteString("VALUE", VALUE); 
    } 

    public void ReadBinary(IBinaryReader reader) 
    { 
     VALUE = reader.ReadString("VALUE"); 
    } 
    public override int GetHashCode() 
    { 
     return VALUE.GetHashCode(); 
    } 

    public override bool Equals(object obj) 
    { 
     return VALUE == ((TestObject)obj).VALUE; 
    } 

} 

ありがとうございます。

答えて

1

キーと値オブジェクトの[QuerySqlField]でマークされたフィールドはすべて、SQLテーブルに直接入ります。

だから、正しいクエリが

select _val,_key from TestObject where NAME=? and VALUE=? 

また、SQLのためのキーと値の両方のタイプを設定することを確認し、次のようになります。

new CacheConfiguration("TestObject", 
     new QueryEntity(typeof(TestObjectPK), typeof(TestObject))) 
+0

パベル私はあなたが言ってみました。しかし、IgniteはまだNAME列に関連したエラーをスローしません。たぶん、私はキャッシュを作成したときにエラーが発生しますか? 'ICache cache = ignite.GetOrCreateCache (新しいCacheConfiguration(" TestObject "、typeof(TestObject))); TestObjectPK testObjectPK = new TestObjectPK(); testObjectPK.NAME = "h1"; testObjectPK.ID = 1; TestObject testObject = new TestObject(); testObject.VALUE = "value1"; cache.Put(testObjectPK、testObject); ' ありがとう – John

+0

クエリでキーフィールドを使用するには、キータイプも指定する必要があります:'新しいCacheConfiguration( "TestObject"、新しいQueryEntity(typeof(TestObjectPK)、typeof(TestObject ))) ')。私は答えを編集しました。 –

+1

ありがとうございます。同じ質問がある人は、私は完全な例でGitHubリポジトリを作成しました:https://github.com/juanpale/ExampleApacheIgniteQueryCompositeObjectNET – John

関連する問題