0

谁能告诉我如何在 Java 代码中对 db4o 使用 Distinct 操作。我在 Java 中找不到任何示例。

谢谢!

4

2 回答 2

4

Afaik,在 distinct-operator 中没有构建。您需要使用解决方法。例如,您可以将 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;
}

回想起来,您可以使用任何容器代替HashSetfor distinctCountries

于 2012-04-10T21:53:47.370 回答