Description
Il y a une entité PersonRepository
et Person
, la classe Person
contient List<Qualification>
. Qualification
classe a 3 champs simples.
J'ai essayé d'ajouter @Query
annotation sur la méthode personnalisée et utilisation de JPQL pour obtenir les résultats, mais Qualification
les champs de classe n'étaient pas disponibles pour la manipulation dans JPQL car le référentiel lui-même contient List<Qualification>
au lieu d'un simple champ de Qualification
.
Comment puis-je rechercher par les champs imbriqués de ces qualifications?
Requête
Maintenant, je dois trouver la liste de l'entité personne où l'expérience de qualificationInMonths est supérieure à 3 et inférieure à 9 ET champ de nom de qualification = 'Java'.
Code
Person.Java
@Data
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private String id;
@NotEmpty
@Size(min = 2)
private String name;
@NotEmpty
@Size(min = 2)
private String surname;
@ElementCollection(targetClass = Java.util.ArrayList.class, fetch = FetchType.EAGER)
private List<Qualification> qualifications = new ArrayList<>();
}
PersonRepository.Java
@Repository
public interface PersonRepository extends JpaRepository<Person, String> {
}
Qualification.Java
@Data
@AllArgsConstructor
public class Qualification implements Serializable {
@Id @GeneratedValue
private String id;
private String name;
private String experienceInMonths;
}
EDIT: pas de doublon de ce post , comme ici est la collection d'objets imbriqués. Pas seulement une référence unique.
Tout d'abord, changez experienceInMonths
de String
en int
(sinon vous ne pourrez pas comparer la chaîne avec le nombre). Ensuite, vous pouvez essayer d'utiliser cette "saucisse":
List<Person> findByQualifications_experienceInMonthsGreaterThanAndQualifications_experienceInMonthsLessThanAndName(int experienceGreater, int experienceLess, String name);
Ou vous pouvez essayer d'utiliser cette jolie méthode:
@Query("select p from Person p left join p.qualifications q where q.experienceInMonths > ?1 and q.experienceInMonths < ?2 and q.name = ?3")
List<Person> findByQualification(int experienceGreater, int experienceLess, String name);