プロパティ名をあらわすクラスである PropertyName において、
同じプロパティ名を表すインスタンスが等しくなりません。
たとえば、
PropertyName<String> p1 = new PropertyName<String>("value"); PropertyName<String> p2 = new PropertyName<String>("value");
で p1.equals(p2) は false になります(PropertyName が equals() を実装していないため)。
jdbcManager が Map を検索のパラメータとして扱えるため、
Dto を作らずに以下のように ActionForm から Map を作り、
必要な個所をタイプセーフ API で置き換えて検索実行を
する場合があります。
public class XxxxForm { public String xxxCd; } public class XxxxAction { : public String index() { : Map<CharSequence, Object> param = new HashMap<CharSequence, Object>(); BeanUtil.copyProperties(xxxxForm, param); param.put(table1().xxxCd(), "新しい値"); // xxxCd() はタイプセーフAPI // xxxxForm.xxxCd の値とtable1().xxxCd()が別物として格納されます jdbcManager.selectBySqlFile(Yyy.class, "hoge.sql", param).getResultList(); :
上記のケースではどちらの値が適用されるかわからず、
予期しない結果を得ることも考えられます。
ですので、PropertyName に equals を実装することで
等しいプロパティを判別することができ、文字列の
プロパティ名とも等しいかどうかを判別できると
良いと考えいます。
以下のような修正をイメージしています。
Index: src/main/java/org/seasar/extension/jdbc/name/PropertyName.java =================================================================== --- src/main/java/org/seasar/extension/jdbc/name/PropertyName.java (revision 4372) +++ src/main/java/org/seasar/extension/jdbc/name/PropertyName.java (working copy) @@ -85,4 +85,19 @@ return name; } + @Override + public boolean equals(Object obj) { + if(this == obj) { + return true; + } + if(obj instanceof PropertyName<?>){ + return name.equals(obj.toString()); + } + return name.equals(obj); + } + + @Override + public int hashCode() { + return name.hashCode(); + } }
対応しました.
http://www.seasar.org/source/changelog/s2container/?cs=4388