Я использую Spring Boot v1.5.3. В моем коде есть операция поиска с множеством условий.
public Page<ParentObject> search(Pageable pageable) {
Specification<ParentObject> specification = (root, cq, cb) -> {
Predicate p = cb.and(
cb.equals(root.get("child").get("id"), "someValue"),
// a lot of predicates appended by conditions
);
return p;
};
Sort newSort = pageable.getSort().and(new Sort(Sort.Direction.ASC, "child.id"));
pageable = new PageRequest(pageable.getPageNumber(), pageable.getPageSize(), newSort)
Page<ParentObject> result = parentObjectRepository.findAll(specification, pageable);
return result;
}
Проблема в том, что моя таблица parent
содержит поле child_id
с индексом. И я хочу, чтобы SQL было похоже на:
SELECT .... FROM parent p INNER JOIN child c ON c.id = p.child_id WHERE ...
ORDER BY p.child_id ASC;
Но в результате я получаю:
SELECT .... FROM parent p INNER JOIN child c ON c.id = p.child_id WHERE ...
ORDER BY c.id ASC;
Обратите внимание на предложение ORDER BY
. Если у меня c.id
индекс не участвует и поиск идет медленно. Если у меня ORDER BY p.child_id
, он работает намного быстрее. Я пытался использовать
Sort newSort = pageable.getSort().and(new Sort(Sort.Direction.ASC, "child"));
, но он не работает должным образом. Entity:
public class ParentObject {
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "child_id", referencedColumnName = "id")
private ChildObject child;
}
Я не могу заменить это на собственный SQL, потому что эта спецификация поиска содержит более 30 операторов if / else, и для переписывания кода потребуется много времени.
Как я могу решить эту проблему? Заранее спасибо за ваши ответы.