谁能告诉我如何在Java代码中对db4o使用Distinct操作。我在Java中找不到任何例子。
谢谢!
答案 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
。