谁能告诉我如何在 Java 代码中对 db4o 使用 Distinct 操作。我在 Java 中找不到任何示例。
谢谢!
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);
我想要一个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
。