私は、同じ "Id"(実際のIdではなく種類)の異なるデータベースから複製されたエンティティを含むリストを持っていますが、別のCreatedDateを持っています。複雑なリストから作成されたセット
最新のCreatedDateで最新のエンティティを複製したいと思います。
例私が作成したユーザーのリストを持っている:
RealId|CreatedDate|Id|Name
1|20170101|1|User1
2|20170102|1|User1Modified
3|20170103|2|User2
4|20170104|2|User2Modified
そのリストから取得するための最良の方法は何か:
RealId|CreatedDate|Id|Name
2|20170102|1|User1Modified
4|20170104|2|User2Modified
これは
List<T> r = query.getResultList();
Set<T> distinct = r.stream().filter(x -> {
List<T> clones = r.stream()
.filter(y -> y.getId() == x.getId())
.collect(Collectors.toList());
T max = clones.stream()
.max(Comparator.comparing(AbstractEntityHistory::getEntryDate))
.get();
return max.getNumber() == x.getNumber();
}).collect(Collectors.toSet());
私の最初の考えであります私が持っている他のアイデアは、日付によって降順に注文し、次にdistinct()を行います。collect()like:
Set<T> distinct2 = r.stream().sorted((x,y) -> {
if(x.getEntryDate().isBefore(y.getEntryDate())) {
return 1;
} else if(x.getEntryDate().isAfter(y.getEntryDate())) {
return -1;
} else {
return 0;
}
}).distinct().collect(Collectors.toSet());
ここで、TはRealIdが等しければそれを監視するequalsを上書きし、それ以外の場合はリフレクションを使用して他のすべてのフィールドを監視します。
は、我々は、SQLクエリの変更を加えることができませんか? – vikiiii
はい質問を変更することができます!私はHibernateを使用しているので、重複を選択しないクエリを作成できると思います。 – baskwo