web-dev-qa-db-fra.com

Comment rechercher avec JpaRepository et la liste imbriquée d'objets?

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.

8
DevDio

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);
12
Cepr0