Как создать предикат BooleanExpression для отношений многие ко многим в QueryDSL
Как можно выполнить внутреннее объединение для отношений "многие ко многим", используя предикат BooleanExpression?
У меня есть 2 лица
public class A {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToMany(fetch = FetchType.LAZY,
cascade = { CascadeType.DETACH, CascadeType.MERGE,
CascadeType.REFRESH, CascadeType.PERSIST})
@JoinTable(name = "a_b_maps",
joinColumns = @JoinColumn(name = "a_id", nullable =
false,referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "b_id", nullable = false,
referencedColumnName = "id")
)
private Set<B> listOfB = new HashSet<B>();
}
public class B {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToMany(fetch = FetchType.LAZY,
cascade = { CascadeType.DETACH, CascadeType.MERGE,
CascadeType.REFRESH, CascadeType.PERSIST})
@JoinTable(name = "a_b_maps",
joinColumns = @JoinColumn(name = "b_id", nullable =
false,referencedColumnName = "id"),
inverseJoinColumns = @JoinColumn(name = "a_id", nullable = false,
referencedColumnName = "id")
)
private Set<A> listOfA = new HashSet<A>();
}
Базовое репо
@NoRepositoryBean
public interface BaseRepository<E, I extends Serializable>
extends JpaRepository<E, I> {
}
И класс хранилища для А
public interface Arepo extends BaseRepository<A, Integer>,
QueryDslPredicateExecutor<A> {
Page<A> findAll(Predicate predicate, Pageable pageRequest);
}
Теперь я хочу использовать Repo с запросом Predicate. Мне нужно сформировать предикат, где я могу загрузить A на основе некоторых данных B
Я старался
QA a = QA.a;
QB b = QB.b;
BooleanExpression boolQuery = null;
JPQLQuery<A> query = new JPAQuery<A>();
query.from(a).innerJoin(a.listOfB, b)
.where(b.id.in(someList));
Теперь я могу сформировать JPQLQuery
, но хранилище ожидает Предикат. Как я могу получить предикат из JPQLQuery??
Или как достичь внутреннего соединения с помощью предиката?
1 ответ
Решение
Я могу создать Предикат с помощью ответа, приведенного здесь.
/questions/28478778/ostavil-soedinenie-s-vesennimi-dannyimi-jpa-i-querydsl/28478798#28478798.
ТАК, вместо того, чтобы использовать JPQLQuery
Я непосредственно использую
a.listOfB.any()
.id.in(list);
Это работает как шарм.