Таблица A:
id
имявозраст
1< /td>
Джо
20
2
Валет
22
3
роза
24
< /table>
Таблица Б:
id
realtion_id
тип
помощь
1
13
9
1
< tr>
2
13
0
2
3
13
8
3
вот это SQL: выберите A.* из A левого соединения B на A.id = B.aid
где (B.realtionId = 13 и B.type = 9) или (B.realtionId = 13 и B.type = 0)
Как я могу использовать JPA или QueryDSL для выполнения этого SQL?
Реальный код немного больше, вопрос выше — это всего лишь основная проблема.
Вот код:
Код: Выделить всё
QCourseware qCourseware = QCourseware.courseware;
QCoursewareRelation qCoursewareRelation = QCoursewareRelation.coursewareRelation;
BooleanExpression expression = qCoursewareRelation.relationId.eq(coursewareParam.getOwner())
.and(qCoursewareRelation.relationType.eq(CoursewareRelationType.PERSON))
.or(qCourseware.userId.eq(coursewareParam.getDeptId())
.and(qCoursewareRelation.relationType.eq(CoursewareRelationType.DEPARTMENT)));
JPAQuery countQuery = new JPAQuery(entityManager);
countQuery.select(Expressions.asSimple("id").count()).from(qCourseware)
.leftJoin(qCourseware.relations, qCoursewareRelation)
.where(expression);
long count = countQuery.fetchFirst();
JPAQuery query = new JPAQuery(entityManager);
List result = query.from(qCourseware)
.leftJoin(qCourseware.relations, qCoursewareRelation)
.where(expression)
.offset(pageable.getOffset())
.limit(pageable.getPageSize())
.fetch();
return new PageImpl(result.stream().map(this::copyToBody).toList(), pageable, count);
Код: Выделить всё
BooleanExpression expression = qCoursewareRelation.relationId.eq(coursewareParam.getOwner())
.and(qCoursewareRelation.relationType.eq(CoursewareRelationType.PERSON))
.or(qCourseware.userId.eq(coursewareParam.getDeptId())
.and(qCoursewareRelation.relationType.eq(CoursewareRelationType.DEPARTMENT)));
Код: Выделить всё
r1_0.c_relation_id = ? AND r1_0.c_relation_type = ? OR r1_0.c_relation_id = ? AND r1_0.c_relation_type = ?
Изменить: я использую спецификацию, но это тоже не работает
Подробнее здесь: https://stackoverflow.com/questions/787 ... omplex-sql