Javaコードでdb4oでDistinct操作を使用する方法を教えてくれる人はいますか? Javaで例が見つかりませんでした。
ありがとう!
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);
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
。