2017-12-27 7 views
0

BeschreibungWie mit JpaRepository und verschachtelte Liste von Objekten zu suchen?

Es gibt eine PersonRepository und Person Einheit, Person Klasse List<Qualification> enthält. Qualification Klasse hat 3 einfache Felder.

Ich habe versucht, @Query Anmerkung auf benutzerdefinierte Methode hinzufügen und verwenden JPQL die Ergebnisse zu erhalten, aber Qualification Klassenfelder waren für die Manipulation in JPQL nicht verfügbar, da es sich List<Qualification> Repository enthält, anstatt nur ein einfaches Feld von Qualification.

Wie kann ich nach den verschachtelten Feldern dieser Qualifikation suchen?

Abfrage

Jetzt brauche ich Liste der Person Entität wo experienceInMonths Qualifikation zu finden, ist größer als 3 und weniger als 9 und Namensfeld Qualifikation = ‚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: nicht duplicate von this post, wie hier ist die Sammlung von verschachtelten Objekten. Nicht nur eine einzige Referenz.

+0

Mögliche Duplikat [Spring Data JPA finden durch eingebettete Objekteigenschaft] (https : //stackoverflow.com/questions/24441411/spring-data-jpa-find-by-embedded-object-property) –

+0

wie in der Bearbeitung des Beitrags erwähnt, entspricht diese Frage nicht der vorgeschlagenen Antwort. Wie Sie in dem eingefügten Code sehen können, gibt es ein Problem mit "List" eines Objekts - nicht nur eines davon. – DevDio

Antwort

1

Zuerst ändern Sie experienceInMonths von String zu int (sonst können Sie die Zeichenfolge nicht mit der Zahl vergleichen). Dann können Sie versuchen, diese ‚Wurst‘ zu verwenden:

List<Person> findByQualifications_experienceInMonthsGreaterThanAndQualifications_experienceInMonthsLessThanAndName(int experienceGreater, int experienceLess, String name); 

Oder Sie können versuchen, diese hübsche nette Methode zu verwenden:

@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); 
+0

hat es lokal für dich funktioniert? die JPQL-Version hat mich 'org.hibernate.QueryException: kann Skalar Collection-Element dereferenzieren:' und die Wurst eins: 'Verursacht durch: java.lang.IllegalStateException: Illegaler Versuch, Pfadquelle [Null] des grundlegenden Typs zu dereferenzieren. Auch mit wechselnden Qualification # experienceInMonths Typ zu "int" – DevDio

+0

@DevDio Versuchen Sie '' Entity' '' Qualifizierung' hinzuzufügen und ersetzen '@ ElementCollection' zu' @ OneToMany' (eine ähnliche Variante funktioniert für mich ...) – Cepr0

+0

Ok, endlich funktionierte es, aber es erforderte die Implementierung von separaten 'Qualification' Tabelle in Hibernate. die FK an Person hält (@Entity, zusätzliche Feldperson mit @ManyToOne) + "QualificationRepository" war verpflichtend. Auch getestete vorgeschlagene Methoden, die Version mit JPQL funktionierte gut, aber der 'Wurst' Name musste angepasst werden: 'findByQualifications_experienceInMonthsGreaterThanAndQualifications_experienceInMonthsLessThanAndQualifications_Name'. Sonst wurde nach Personenname gesucht. Vielen Dank für die Hilfe @ Cepr0! – DevDio

Verwandte Themen