2 votes

Triage des pages de printemps sur l'attribut nullable d'une autre entité.

Je suis tombé sur le problème suivant... J'ai trois entités :

@Entity
class Contract {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    private Employee employee;
}

@Entity
class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    @ManyToOne
    private Department department;
}

@Entity
class Department {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;
}

et méthode utilisant la spécification pour récupérer des informations sur les contrats :

Page<Contract> getContracts(Integer employeeId, Pageable pageable) {
    return contractRepository.findAll(createSpecification(employeeId), pageable);
}

Specification<Contract> createSpecification(Integer employeeId) {
    return Specification.where(equalEmployeeId(employeeId));
}

Specification<Contract> equalEmployeeId(Integer employeeId) {
        return (root, criteriaQuery, criteriaBuilder) -> {
            if (Objects.nonNull(employeeId)) {
                Join<Contract, Employee> joinParent = root.join("employee");
                return criteriaBuilder.equal(joinParent.get("id"), employeeId);
            } else {
                return criteriaBuilder.isTrue(criteriaBuilder.literal(true));
            }
        };
    }

et maintenant, mon application donne la possibilité de trier Contract entités par Department nom, alors il y a Pageable avec sort paramètre réglé sur employee.department.name . Et le problème se pose lorsque Employee L'objet a department défini comme nul... Par exemple, si tous les Employee les objets ont department défini à null, alors une collection vide est renvoyée. Que puis-je faire pour modifier ce comportement et faire en sorte que tous les paramètres de la collection Contract entités retournées, indépendamment Employee's department est nulle ou non ?

J'ai déjà essayé différentes choses : ajouter fetch join à la spécification, paramétrer spring.jpa.properties.hibernate.order_by.default_null_ordering a last mais rien n'y fait.

Merci d'avance pour toute aide !

PS : Ne me conseillez pas de me débarrasser des spécifications, etc. - le code que j'ai fourni est simplifié dans un souci de lisibilité. En réalité, il y a beaucoup plus d'attributs et l'utilisation de Spécifications pour le filtrage est l'approche la plus pratique.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X