这是我之前发布的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
如何正确编写此过滤器?
答案 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