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.
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
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 –
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