Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Spring Data Einträge von User zahlen und auflisten
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:
@Repository
public interface EntraegeRepository extends JpaRepository<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();
interface EintraegeProjection {
String getUserName();
int getCount();
}
}
@ExtendWith(SpringExtension.class)
@SpringBootTest
class EntraegeRepositoryTest {
@Autowired
EntraegeRepository entraegeRepository;
@BeforeEach
void setUp() {
final Eintraege eintraege = new Eintraege();
final User a = new User("a");
eintraege.setUser(a);
entraegeRepository.save(eintraege);
final Eintraege eintraege2 = new Eintraege();
final User b = new User("b");
eintraege2.setUser(b);
entraegeRepository.save(eintraege2);
}
@Test
void testCountUserEintraege() {
final List<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?