Как создать предикат 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);

Это работает как шарм.

Другие вопросы по тегам