如何在Java中使用数据库DB4O上的distinct?

时间:2010-05-13 08:48:20

标签: java db4o

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

谢谢!

2 个答案:

答案 0 :(得分:4)

Afaik,没有不同的运营商。你需要使用一种解决方法。例如,您可以使用Set作为distinct-operation:

区别于对象的相等性。当你的类有一个正确的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);

答案 1 :(得分: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 distinctCountries