0

コードにクエリがあり、1つのオブジェクトで複数のIDを検索します。表には、 (外部キー)、(外部キー)、および。PreparationPhytoterapicのフィールドが含まれています。問題は、に複数のエントリが含まれている場合、リストに再度追加されることです。phytoterapicItem_idpreparationItem_ididpreparationItem_id

使ってみif(!listPreparations.contains(preparationContents2.get(0)))ましたがうまくいきません。

何か案が?

        preparationphytoterapicDao = getHelper().getPreparationPhytoterapicDao();
        QueryBuilder<PreparationPhytoterapic, Integer> queryBuilder2 = 
            preparationphytoterapicDao.queryBuilder();
        Where<PreparationPhytoterapic, Integer> where2 = queryBuilder2.where();
        SelectArg selectArg = new SelectArg();
        where2.eq("phytoterapicItem_id", selectArg);
        PreparedQuery<PreparationPhytoterapic> preparedQuery2 = queryBuilder2.prepare();
        List<PreparationPhytoterapic> preparationphytoterapics;
        QueryBuilder<PreparationContent, Integer> queryBuilder3 = 
            preparationContentDao.queryBuilder();
        Where<PreparationContent, Integer> where3 = queryBuilder3.where();
        SelectArg selectArg2 = new SelectArg();
        where3.eq("id", selectArg2);
        PreparedQuery<PreparationContent> preparedQuery3 = queryBuilder3.prepare();
        List<PreparationContent> preparationContents2;
        for(int j = 0; j < listPhytoterapics.size(); j++) {
            selectArg.setValue(listPhytoterapics.get(j).getPhytoterapicItem().getId());
            preparationphytoterapics = preparationphytoterapicDao.query(preparedQuery2);
            if(preparationphytoterapics.size() != 0) {
                for(int k = 0; k < preparationphytoterapics.size(); k++) {
                    selectArg2.setValue(preparationphytoterapics.get(k).getPreparationItem().getId());
                    preparationContents2 = preparationContentDao.query(preparedQuery3);
                    if(!listPreparations.contains(preparationContents2.get(0)))
                        listPreparations.add(preparationContents2.get(0));
                }
            }
4

1 に答える 1

1

List.contains(...)メソッド定義を見ると、次のよう に書かれています。

このリストに指定された要素が含まれている場合、true を返します。より正式には、このリストに (o==null ? e==null : o.equals(e)) となる要素 e が少なくとも 1 つ含まれている場合にのみ true を返します。

フィールド全体を使用するメソッドが定義されていないと思われます。それがあなたの望むものだと思います。オブジェクトに次のようなものが必要です。それらを対称にするためにもオーバーライドする必要があります。equals(...)PreparationContentidhashCode()

  @Override
  public boolean equals(Object obj) {
      if (obj == null || obj.getClass() != this.getClass()) {
          return false;
      }
      PreparationContent other = (PreparationContent)obj;
      return this.id = other.id;
  }

  @Override
  public int hashCode() {
      // if id is long then return Long.valueOf(id).hashCode();
      return id;
  }
于 2012-06-26T15:23:52.250 に答える