2017-10-17 1 views
0

Ich versuche, eine Liste von Objekten mithilfe einer Liste von eingebetteten Primärschlüsseln abzufragen. Etwas wie folgt aus:Abfrage mit einer Liste von eingebetteten Primärschlüsseln

User.java

public class User { 
    @EmbeddedId 
    protected UserPK userPK; 

    //getter & setters... 
} 

UserPK.java

@Embeddable 
public class UserPK { 
    @Column(name = "id") 
    private Long id; 

    @Column(name = "group") 
    private String group; 

    //getter & setters... 
} 

UserDao.java

public List<Long> getUsersById(List<UserPK> ids) { 
    TypedQuery<User> q = entityManager.createQuery(
     "SELECT u FROM User AS u WHERE u.userPK IN :ids", User.class); 
    q.setParameter("ids", ids); 
    return q.getResultList(); 
} 

Grundsätzlich bin ich für mehrere Benutzer abfragen, können sagen, :

id = 1 group = "it" id = 2 group = "deu"

Wie kann ich Benutzer mit einer Liste von zusammengesetzten Primärschlüsseln abfragen?

+1

möglich duplizieren https://stackoverflow.com/questions/3126366/doing-an-in-query-with-hibernate aber wieder schwer zu wissen, es sei denn, Sie fragen eine Frage –

+0

Ja, ich bin bewusst, IN für einzelne Felder, aber nicht eingebettete Objekte zu verwenden. In diesem Fall ist der Primärschlüssel ein zusammengesetzter Schlüssel. Daher bin ich nicht sicher, ob ich diese Abfrage erstellen soll. – Rawr

Antwort

1

Was Sie getan haben, ist völlig in Ordnung, obwohl es eine geringfügige Korrektur für den Rückgabetyp getUsersById Methode, die List<User> anstelle von List<Long> sein muss.

Sie können Abfragen mithilfe einer Liste von UserPKs-Objekten durchführen und diese als Parameter für Ihren IN-Operator verwenden. So ist die Abfrage unten (wie Sie haben) wird funktionieren:

public List<User> getUsersByIdCombo(List<UserPK> ids) { 
    TypedQuery<User> q = entityManager.createQuery("SELECT u FROM User AS u WHERE u.userPK IN :ids", User.class); 
    q.setParameter("ids", ids); 
    return q.getResultList(); 
} 

Sie auch explizit durch das Durchlaufen die eingebettete ID-Klasse abfragen können (userPK.id oder userPK.group). Hier sind Beispiele unten:

public List<User> getUsersById(List<Long> ids) { 
    TypedQuery<User> q = entityManager.createQuery("SELECT u FROM User AS u WHERE u.userPK.id IN :ids", User.class); 
    q.setParameter("ids", ids); 
    return q.getResultList(); 
} 

public List<User> getUsersByGroup(List<String> groups) { 
    TypedQuery<User> q = entityManager.createQuery("SELECT u FROM User AS u WHERE u.userPK.group IN :groups", User.class); 
    q.setParameter("groups", groups); 
    return q.getResultList(); 
} 

public User getSingleUserByIdAndGroup(Long id, String group) { 
    TypedQuery<User> q = entityManager.createQuery("SELECT u FROM User AS u WHERE u.userPK.id = :id AND u.userPK.group = :group", User.class); 
    q.setParameter("id", id); 
    q.setParameter("group", group); 
    return q.getSingleResult(); 
} 

Lassen Sie uns sehen, wie diese Abfragen verhalten, indem Sie jede Methode testen. Nehmen wir an, wir haben diese Daten in Ihrer USER Tabelle.

enter image description here

Beispiel 1: Abfrage Benutzer durch die Liste von UserPK Objekte

List<UserPK> userPKs = new ArrayList<UserPK>(); 
    userPKs.add(new UserPK(1L, "it")); 
    userPKs.add(new UserPK(4L, "eng")); 
    List<User> userListQuery1 = userDAO.getUsersByIdCombo(userPKs); 
    for (User user: userListQuery1) { 
     System.out.println(user); 
    } 

Ergebnis:

ID: 4 | GROUP: eng 
ID: 1 | GROUP: it 

Beispiel 2: Abfrage Benutzer durch Liste der IDs

List<Long> ids = new ArrayList<Long>(); 
    ids.add(2L); 
    ids.add(5L); 
    List<User> userListQuery2 = userDAO.getUsersById(ids); 
    for (User user: userListQuery2) { 
     System.out.println(user); 
    } 

Ergebnis:

ID: 5 | GROUP: eng 
ID: 2 | GROUP: it 

Beispiel 3: Abfrage-Benutzer durch die Liste von Gruppen

List<String> groups = new ArrayList<String>(); 
    groups.add("it"); 
    groups.add("eng"); 
    List<User> userListQuery3 = userDAO.getUsersByGroup(groups); 
    for (User user: userListQuery3) { 
     System.out.println(user); 
    } 

Ergebnis:

ID: 4 | GROUP: eng 
ID: 5 | GROUP: eng 
ID: 1 | GROUP: it 
ID: 2 | GROUP: it 

Beispiel 4: Abfrage einzelner Benutzer von id und nach Gruppe

User user = userDAO.getSingleUserByIdAndGroup(3L, "hr"); 
    System.out.println(user); 

Ergebnis:

ID: 3 | GROUP: hr 
+0

Sie können einen Beispielcode von hier sehen: https://github.com/balagueri21/sample-codes/tree/master/QueryCompositePrimaryKeys – Ish

+0

Vielen Dank, schätzen die detaillierte Antwort. – Rawr

Verwandte Themen