Java 8 Stream-如何从子属性或子属性集中找到父实体?

时间:2019-05-24 12:46:25

标签: java java-stream

这是我之前发布的this question的下一步。

现在的情况类似于:

afterRequest()

public class CustomizedRequestLoggingFilter extends AbstractRequestLoggingFilter {

    @Override
    protected void beforeRequest(HttpServletRequest httpServletRequest, String message) {
        this.logger.debug(message);
    }

    @Override
    protected void afterRequest(HttpServletRequest httpServletRequest, String message) {

    }
}

使用public class A { private String id; @ManyToOne private B b; @ManyToMany private Set<B> bSet; // getters and setters } API拥有public class B { private String id; // other attributes // getters and setters } 实例时,如何找到A实例?我正在尝试类似的东西:

B

如何正确编写此过滤器?

1 个答案:

答案 0 :(得分:1)

您可以这样实现:

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);
}

即类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    

在您的情况下,JPA自动创建了一些类B的对象。这意味着内存中可能存在类B的不同对象,它们具有相同的id

您可以自己实现equals()。每个不错的IDE都有一种自动生成它的方法。例如,在这里,如果两个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