У нас есть 3 объекта A, B и C. Мы ищем в таблице A с полями внутри B и C. И отображение является однонаправленным, поэтому B и Collection не определены в A. Мы используем спецификацию Spring, как мы можем выполнить соединение в этом случае без преобразования отображения в двунаправленное?
@Entity
public class A {
@Id
Long id
String name
}
@Entity
public class B {
@Id
Long id
@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "a_id")
A a;
@Column
String country;
}
@Entity
public class C {
@Id
Long id
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "a_id")
private A a;
}
Например, если B определено в A так,
@Entity
public class A {
@Id
Long id
String name
@OneToOne(mappedBy = "request")
private B b;
}
соединение будет таким
public static Specification<A> countryEquals(String country) {
return (root, query, builder) -> builder.equal(
root.join("b", JoinType.LEFT).get("country"), country);
}
Но B не определено в A, тогда как применить соединение?
вы можете попробовать присоединиться к нему с помощью самого B, вы создаете новый корень и изображение, вы добавляете where b.a_id = a.id
к своему запросу или здесь, вы CriteriaBuilder, затем вы можете добавить больше предикатов для поиска полей в таблице B. Что-то вроде этого, несколько псевдокод, потому что у меня нет своего кода здесь, и я записываю его по памяти, но я надеюсь, что это может помочь
public static Specification<A> countryEquals(String country) {
return (root, query, builder) -> (
Root<B> b_root = query.from(B.class);
Predicate b_join = builder.equal(b_root.get("a_id"), root.get("id"))
Predicate b_country = builder.equal(b_root.get("country"), country) // or like with `%country%`
return builder.and(other_predicate,...., b_join, b_country)
)
}