class User{
@Id
@GeneratedValue
private Long id;
private String name;
// Getter / setter
}
Code:
class Eintraege{
@Id
@GeneratedValue
private Long id;
@OneToOne(cascadeType=CascadeType.All)
private User user;
// Getter / setter
}
Die zwei DB Tabellen werden aktuell auch befüllt. Meine Frage ist jetzt wie kann ich im Spring Data den folgenden Statement erstellen?
Code:
Select u.name, count(e.*) from User u inner join Eintraege e on u.id = e.user.id
Im Endeffekt soll das Ergebnis so aussehen
Name Anzahl Eintraege
----------------------------------------
Müller 10
Kraus 22
Punda 41
Karm 6
Jean 1
Muss ich da ein neue Klasse für das Ergebnis erstellen, der die Anzahl er Einträge mit Namen zwischenspeichert?
Oder mache ich da eine Datenbank View? Wie wird das dann von Spring Data abegrufen?
Kannst du deine Lösung hier schreiben? Ich hatte mir das Problem nachgebaut und auch etwas mit Projection probiert, war jedoch nicht ganz erfolgreich. Außerdem war mir unklar ob du es nun in einen eigenen Datentypen mappen willst oder als Map<String, Long>.
Kannst du deine Lösung hier schreiben? Ich hatte mir das Problem nachgebaut und auch etwas mit Projection probiert, war jedoch nicht ganz erfolgreich. Außerdem war mir unklar ob du es nun in einen eigenen Datentypen mappen willst oder als Map<String, Long>.
Ich habe mir ein neuer Interface dafür angelegt "UserRanking" mit getName und getCount.
Im InterfaceRepository Klasse habe ich dann um die Methode erweitert.
Code:
@Query(value="
Select u.name, count(e.*) from User u inner join Eintraege e on u.id = e.user.id group by u.name")
List<UserRanking> countEntraegeByUser();
Ich habe das unegfähr so gemacht, den Code habe ich leider zu Hause.
Ok, also hast du es auch über eine Projection gelöst. Mein letzter Stand war:
Java:
@RepositorypublicinterfaceEntraegeRepositoryextendsJpaRepository<Eintraege,Long>{@Query("Select u.name as UserName, count(e.id) as Count from User u inner join Eintraege e on u.id = e.user.id group by u.name")List<EintraegeProjection>countUserEintraege();interfaceEintraegeProjection{StringgetUserName();intgetCount();}}@ExtendWith(SpringExtension.class)@SpringBootTestclassEntraegeRepositoryTest{@AutowiredEntraegeRepository entraegeRepository;@BeforeEachvoidsetUp(){finalEintraege eintraege =newEintraege();finalUser a =newUser("a");
eintraege.setUser(a);
entraegeRepository.save(eintraege);finalEintraege eintraege2 =newEintraege();finalUser b =newUser("b");
eintraege2.setUser(b);
entraegeRepository.save(eintraege2);}@TestvoidtestCountUserEintraege(){finalList<EntraegeRepository.EintraegeProjection> eintraegeProjections = entraegeRepository.countUserEintraege();assertThat(eintraegeProjections).isNotEmpty();assertThat(eintraegeProjections.get(0).getUserName()).isEqualTo("a");}}
aber leider lieferten die Aufrufe immer null. Siehst du auf Anhieb den entscheidenden Unterschied?