Несколько объектов отображаются в один объект в Hibernate через один столбец

Вы пытаетесь сделать то, что Java на самом деле не предназначено для.

Если вы в состоянии это сделать, вам лучше добавить атрибут к Object1, который будет списком из Object2, содержащего объекты, связанные с this.

Если вы не можете, у нас еще есть возможность сделать это наивно, иначе вы можете попробовать что-то вроде этого:

HashSet<Integer> hs = new HashSet<Integer>(list2.size());
for(Object2 o : list2) {
    hs.add(o.object1id);
}
//hs contains all the ids of list2
List<Object1> result = new ArrayList<Object1>(); //Or another class implementing List
for(Object1 o : list1) {
    if(hs.contains(o.id))
        result.add(o);
}

Не красиво, поскольку вам нужно сохранить все идентификаторы в HashSet, но так как добавление и доступ к элементам в HashSet - это O (1) (теоретически), алгоритм O (n + m)

Если ваш Object3 класс построен с помощью Object1 и Object2, используйте HasMap вместо HashSet, где ключи являются идентификаторами, а значения - объектом2. Последний цикл for в коде будет выглядеть следующим образом:

Object2 o2 = hs.get(o.id);
if(o2 != null)
    result.add(new Object3(o, o2);

В дополнение к комментарию Óscar López:

Если ваш objectid1 не уникален, вам необходимо адаптировать код следующим образом:

HashMap<Integer, List<Object2>> hm = new HashMap<Integer, List<Object2>>();
for(Object2 o : list2) {
    List<Object2> l = hm.get(o.objectid1);
    if(l != null) {
        l.add(o);
    } else {
        List<Object2> l = new ArrayList<Object2>();
        l.add(o);
        hm.put(o.objectid1, l);
}
//hm is map, where each entry contains the list of Object2 associated with objectid1
List<Object1> result = new ArrayList<Object1>();
for(Object1 o : list1) {
    List<Object2> l = hm.get(o.id);
    //l contains all Object2 with object1id = o.id
    for(Object2 o2 : l)
        result.add(new Object3(o, o2));
}

Все еще в O (n + m), но с большими константами ...

0
задан Yossi 5 March 2019 в 01:07
поделиться