2016-06-10 17 views
3

Ich habe Abfrage folgende was in Ordnung funktioniert:JPA Kriterien - holen mit where-Klausel

public ContractorContractor findContractorByName(String contractorName) { 
    CriteriaBuilder builder = em.getCriteriaBuilder(); 
    CriteriaQuery<ContractorContractor> query = builder.createQuery(ContractorContractor.class); 
    Root<ContractorContractor> root = query.from(ContractorContractor.class); 
    query.select(root).distinct(true); 

    Predicate namePredicate = builder.like(root.get(ContractorContractor_.name), contractorName); 
    query.where(builder.and(namePredicate)); 

    return em.createQuery(query).getSingleResult(); 
} 

Above Abfrage mir einzigen Auftragnehmer von Namen gibt oder Ausnahme auslöst. Jetzt möchte ich das gleiche tun, aber mehr Informationen über Auftragnehmer (fügen Sie den Abruf zu einem anderen Kind des Auftragnehmers), aber mit der folgenden Abfrage bekomme ich kein Ergebnis (org.springframework.dao.EmptyResultDataAccessException: Kein Ergebnis für die Abfrage gefunden wird geworfen). Abfrage mit fetch:

Kann mir jemand sagen, was ich falsch mache und warum in obiger Abfrage?

+0

Welche SQL wird vom JPA-Provider GENERIERT? schau in sein Protokoll. Dies ist ein Schritt namens "Debugging" –

+0

http://pastebin.com/c1QYb6TY gibt es eine ganze Reihe von Spalten, aber .. – Gazeciarz

+0

so führen Sie die SQL selbst MANUELL im Datenspeicher –

Antwort

0

Es scheint, dass Sie versehentlich die Domain Ihrer Abfrage durch das Hinzufügen einer inneren holen verbinden mit dem Zusatz der folgenden Aussage beschränkt haben:

root.fetch(ContractorContractor_.countries); 

Per JPA 2.1, JSR 338, 6.5 Abschnitt. 4

[...] eine fetch beitreten muss die gleiche Semantik wie die Join entsprechenden inneren oder äußeren join [...]

So ist die implizite innere Veränderung (JoinType.INNER) zu einem (äußeren) verbinden holen links holen kommen sollte Ihr Problem lösen:

root.fetch(ContractorContractor_.countries, JoinType.LEFT); 

Diese Nebenwirkung könnte ein wenig unerwartet scheinen was wahrscheinlich ist, warum Die Autoren der Spezifikation fügten den folgenden Kommentar hinzu (wenngleich im Zusammenhang mit Standardverbindungen, Abschnitt 4.4.7):

Anwendungsentwickler sollten bei der Definition von identifatia Vorsicht walten lassen auf Variablen , weil die Domäne der Abfrage davon abhängen kann, ob es Werte des deklarierten Typs gibt.