Uploaded image for project: 'S2Container'
  1. S2Container
  2. CONTAINER-393

[S2JDBC] PropertyNameをプロパティ名として文字列などとも比較できるようにしました.

    Details

    • Type: Improvement
    • Status: Resolved
    • Priority: Major
    • Resolution: Fixed
    • Affects Version/s: 2.4.39
    • Fix Version/s: 2.4.40
    • Component/s: S2JDBC
    • Labels:
      None

      Description

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

        Attachments

          Activity

            People

            • Assignee:
              koichik koichik
              Reporter:
              shinsuke shinsuke
            • Votes:
              0 Vote for this issue
              Watchers:
              0 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: