Querydsl поиск с джоинами

Есть три таблицы:

my_entity: id, ....

comment: id, my_entity_id, description_id, date, active ...

description: id, ...

В коде это выглядит так:

@Table(name = "my_entity")
public class MyEntity {
    @OneToMany(mappedBy = my_entity_id, cascade = CascadeType.ALL)
    private Set<@Valid CommentEntity> comments;
}

@Table(name = "comment")
public class CommentEntity {

   @ManyToOne(cascade = {CascadeType.REFRESH, CascadeType.DETACH}, optional = false)
   @JoinColumn(name = "my_entity_id", nullable = false)
   protected MyEntity myEntity;


    @Column(name = "description_id")
    @Convert(converter = DescriptionConverter.class)
    private Descriprtion description;
}

Как видно MyEntity имеет массив комметов.

Я использую QueryDSL. Я создал BooleanBuilder. И пытаюсь туда накидать условие:

Найти сущности (MyEntity) у которых есть коммент с определенным Description. Подразумевается, что у меня уже есть экземплят объекта Description. При этом в массиве комментов надо брать только последний по дате активный коммент.

Если бы в MyEntity был бы не Set, а сразу переменная класса Comment, я бы сделал так:

builder.and(myEntity.comment.description.eq(description)).

Но в моем случае еще надо отобрать последний активный коммент и проверить у недо наличие указаного description. И только с такими комментами возвращать entity.

Как мне составить такой запрос?


Ответы (1 шт):

Автор решения: Alexandr

Попробуйте так:

QMyEntity user = QMyEntity.myEntity;
QCommentEntity comment1 = QCommentEntity.commentEntity;
QCommentEntity comment2 = QCommentEntity.commentEntity;

List<MyEntity> myEntities =
        queryFactory
                .select(user)
                .from(user)
                .where(JPAExpressions.selectOne()
                        .from(comment1)
                        .where(comment1.myEntity.eq(user)
                                .and(comment1.description.eq(description))
                                .and(comment1.active.eq(true))
                                .and(comment1.date.eq(JPAExpressions.select(comment2.date.max())
                                        .from(comment2)
                                        .where(comment2.myEntity.eq(comment1.myEntity)))))
                        .exists())
                .fetch();
→ Ссылка