0

Javaコードでdb4oでDistinct操作を使用する方法を教えてくれる人はいますか? Javaで例が見つかりませんでした。

ありがとう!

4

2 に答える 2

4

Afaik、distinct-operator にはビルドがありません。回避策を使用する必要があります。たとえば、distinct-operation に Set を使用できます。

オブジェクトの同等性によって区別されます。クラスに適切な equals() と hashCode() の実装がある場合、これはうまく機能します。

ObjectSet<TestClass> result = container.query(TestClass.class);
// will use the equals-method of TestClass.
Set<TestClass> distinctResult = new HashSet<TestClass>(result);

特定の分野で区別されます。特定のフィールドで区別したい場合に便利です。

ObjectSet<TestClass> result = container.query(TestClass.class);
Set<TestClass> distinctResultByField = new TreeSet<TestClass>(new Comparator<TestClass>() {
    public int compare(TestClass o1, TestClass o2) {
       return o1.getTestField().compareTo(o2.getTestField());
    }
});
distinctResultByField.addAll(result);
于 2010-05-13T10:58:07.610 に答える
0

select from ... order by... distinctクエリが欲しかった。これが私がそれをした方法です:

public static List<Country> getAllCountries(final CountryOrder order)
{
   ObjectContainer oc = DbHelper.getInstance().getContainer();
   ObjectSet<Country> countries = oc.query(new Predicate<Country>()
   {
      HashSet<Country> distinctCountries = new HashSet<Country>();

      @Override
      public boolean match(Country et)
      { // Need this to make a distict query... sad
         if (distinctCountries.contains(et))
         {
            return false;
         }

         distinctCountries.add(et);
         return true;
      }
   }, new Comparator<Country>()
   {
      @Override
      public int compare(Country o1, Country o2)
      {
         switch (order)
         {
            case COUNTRY_CODE:
               return o1.getCountryCode().compareTo(o2.getCountryCode());
            case COUNTRY_NAME:
               return o1.getCountryName().compareTo(o2.getCountryName());
            default:
               return o1.compareTo(o2);
         }
      }
   });

   return countries;
}

HashSet振り返ってみると、 forの代わりに任意のコンテナを使用できますdistinctCountries

于 2012-04-10T21:53:47.370 に答える