プロパティ名をあらわすクラスである 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();
+ }
}