Как я могу заказать список, используя CriteriaQuery в моих спецификациях? - PullRequest
2 голосов
/ 25 июня 2019

Я пытаюсь упорядочить списки, возвращаемые моим JpaRepository. Я использую Specification классы, а не @Query аннотацию, и согласно этому вопросу я должен использовать CriteriaQuery объект.

Моя спецификация в настоящее время выглядит следующим образом:

public class MessageSpecification {

    public static Specification<MessageEntity> hasDemandeId(Long demandeId) {
        return (root, query, criteriaBuilder) -> {
            // TODO : order the list
            return criteriaBuilder.equal(root.join(MessageEntity_.demande).get(DemandeEntity_.idTechnique), demandeId);
        };
    }
}

Как видите, у меня есть два класса сущностей MessageEntity и DemandeEntity, где MessageEntity имеет свойство, ссылающееся на DemandeEntity. Итак, в этой спецификации я получаю список MessageEntity с указанным идентификатором DemandeEntity.

Теперь я хотел бы сделать эквивалент ORDER BY Message.ID. Для этого я попытался использовать объект CriteriaQuery в моем предикате (переменная query):

return (root, query, criteriaBuilder) -> {
    query.orderBy(criteriaBuilder.asc(root.get(MessageEntity_.idTechnique)));
    return criteriaBuilder.equal(root.join(MessageEntity_.demande).get(DemandeEntity_.idTechnique), demandeId);
};

Но это не работает, он все равно возвращает список в том же порядке, использую ли я criteriaBuilder.desc() или criteriaBuilder.asc().

Я предполагаю, что я делаю что-то не так, как я должен использовать этот CriteriaQuery объект?

Ответы [ 2 ]

0 голосов
/ 16 июля 2019

Я не нашел решения с помощью класса Specification, поэтому решил использовать класс Sort для упорядочения своего списка:

public Sort sortByIdTechnique(){
    return new Sort(Sort.Direction.ASC, "idTechnique");
}

JpaRepository findAll принимает объект Sort в качестве параметра, а также спецификацию:

List<MessageEntity> messages = repository.findAll(MessageSpecification.hasDemandeId(idDemande), sortByIdTechnique());
0 голосов
/ 25 июня 2019

Попробуйте это:

return query.where(criteriaBuilder.equal(root.join(MessageEntity_.demande).get(DemandeEntity_.idTechnique), demandeId))
            .orderBy(cb.asc(root.get(MessageEntity_.idTechnique)))
            .distinct(true)
            .getRestriction();
...