Mirage SqlManagerImpl#findEntity に指定する可変引数の順番が明示的でない
エンティティクラスに複数のプライマリーキーフィールドがあったとします。
public class SomeEntity { @PrimaryKey(persistent=true) private String key1; @PrimaryKey(persistent=true) private String key2; private String value; // コンストラクタ、getter/setterは省略 }
このとき、SqlManagerImpl#findEntityの第2引数以後に指定する引数の順番が、必ずしもエンティティクラスでの宣言順でよいとは限りません。つまり、key1に"1"、key2に"2"を指定して検索したい場合でも・・・
SomeEntity entity = findEntity(SomeEntity.class, "1", "2");
SomeEntity entity = findEntity(SomeEntity.class, "2", "1");
おそらく、java.lang.Class#getMethodsやjava.lang.Class#getFieldsが返す配列の要素の並び方に依存しているのではないでしょうか?これらのメソッドが返す配列の要素の順番は不定であるとされています。
以下は提案ですが、insertEntity や deleteEntity と使用法が同様になるように
public <T> T findEntity(T param)
とするか、あるいは
public <T> T findEntity(Class<T> clazz, Map<String, Object> param)
として、WHEREの条件とパラメーターを明示的に関連付けて指定できるようにすべきかと思います。
エンティティクラスに複数のプライマリーキーフィールドがあったとします。
このとき、SqlManagerImpl#findEntityの第2引数以後に指定する引数の順番が、必ずしもエンティティクラスでの宣言順でよいとは限りません。つまり、key1に"1"、key2に"2"を指定して検索したい場合でも・・・
とすべきか とすべきなのかは、実際に実行してみてMirageが出力するデバッグ文をみないと判断できません。おそらく、java.lang.Class#getMethodsやjava.lang.Class#getFieldsが返す配列の要素の並び方に依存しているのではないでしょうか?これらのメソッドが返す配列の要素の順番は不定であるとされています。
以下は提案ですが、insertEntity や deleteEntity と使用法が同様になるように
とするか、あるいは
として、WHEREの条件とパラメーターを明示的に関連付けて指定できるようにすべきかと思います。