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.