2017-08-22 6 views
3

私は、同じ "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を上書きし、それ以外の場合はリフレクションを使用して他のすべてのフィールドを監視します。

+0

は、我々は、SQLクエリの変更を加えることができませんか? – vikiiii

+0

はい質問を変更することができます!私はHibernateを使用しているので、重複を選択しないクエリを作成できると思います。 – baskwo

答えて

4

このお試しください:ここで

List<YourObject> collect = activities 
       .stream() 
       .collect(Collectors.groupingBy(
         YourObject::getId, 
         Collectors.maxBy(Comparator.comparing(YourObject::getCreatedDate)))) 
       .entrySet() 
       .stream() 
       .map(e -> e.getValue().get()) 
       .collect(Collectors.toList()); 

id、最新createDateによってグループ化Map<Integer, Optional<YourObject>>を作成するためにCollectors.groupingByを使用しています。あなたはこのマップのentrySetを取得し、それをListに集めます。 java8機能のものがなければ

+3

あなたのアプローチを説明できますか?これは、*コードのみの回答よりも役立ちます。 – Zabuza

+0

HibernateとH2 Embedded Databaseを使用すると、getAllを使用してメソッドを使用するか、同じ処理を行うクエリを作成する方が良いでしょうか? – baskwo

+0

@baskwo - エンティティをgetAllするときの実装です。 –

0

Map<Long, Item> map = new HashMap<>(); 
    for (Item item: items) { 
     Item old = map.get(item.getId()); 
     if (old == null || old.getDate().before(item.getDate())) { 
      map.put(item.getId(), item); 
     } 
    } 

    List<Item> result = new ArrayList<Item>(map.values()); 
関連する問題