Вы можете реализовать его следующим образом:
public static A findAFromB(B b) {
List<A> aList = aService.findAll();
return aList.stream()
.filter((A a) -> a.getB().equals(b) || a.getBSet().contains(b))
.findFirst()
.get();
}
Но он не будет работать с реализацией по умолчанию B::equals()
, а именно:
public boolean equals(Object obj) {
return (this == obj);
}
т.е. 2объекты класса B
будут равны, только если они являются одним и тем же экземпляром.Если вы создадите 2 объекта класса B с одинаковым значением для каждого поля, equals()
все равно вернет false
.Вот пример:
B b1 = new B();
b1.setId("1234")
B b2 = new B();
b2.setId("1234")
System.out.println(b1 == b1); // displays true
System.out.println(b1.equals(b1)); // displays true
System.out.println(b2 == b1); // displays false
System.out.println(b2.equals(b1)); // displays false
В вашем случае есть некоторый объект класса B
, который автоматически создается JPA.Это означает, что в памяти могут быть различные объекты класса B
с одинаковыми id
.
Вы можете указать собственную реализацию equals()
.У каждой достойной IDE есть способ автоматически сгенерировать его.Например, здесь представляется разумным считать, что 2 B
экземпляров равны, если они имеют одинаковые id
:
public class B {
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
B b = (B) o;
return Objects.equals(id, b.id);
}
}
System.out.println(b1 == b1); // displays true
System.out.println(b1.equals(b1)); // displays true
System.out.println(b2 == b1); // displays false
System.out.println(b2.equals(b1)); // displays true