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 шт):
Попробуйте так:
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();