Hibernate OneToMany zliczanie pogrupowanych wyników

Hibernate OneToMany zliczanie pogrupowanych wyników
MA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Hej,
mam prosta strukturę:

Kopiuj
@Entity
@Data
public class Comment {
  private Long id;
  private String comment;

  @OneToMany
  private List<CommentReaction> commentReactions;

  //Jak ogarnac taka liste, czytaj dalej
  List<ReactionCount> reactionsCount;
}
Kopiuj
@Entity
@Data
public class CommentReaction {
   private Long id;
   private User user;

   @Enumerated
   private Reaction reaction;
}
Kopiuj
public enum Reaction {
  OK, BAD;
}

Czy da się w obiekcie Comment w jakis posob np przy pomocy Formula czy czegos podobnego policzyc ile jest reakcji każdego typu np. do jakiegos obiektu typu

Kopiuj
@Data
public class ReactionCount {
   private Reaction reaction;
   private int reactionCount;
}
hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 741
0

Tak jak napisałeś, ogarniasz to sobie formułą, np po typie reakcji.

Kopiuj
public class Reaction {
 TypeEnum type;
 Comment comment;
}
public class Comment {
    @Formula("(SELECT COUNT(R.id) FROM Reaction R WHERE R.comment = id AND R.type = 'POSITIVE')")
    long positiveReactionCount;
}

hzmzp
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 741
0

Możesz zrobić w sql trigger na dodawanie reakcji które aktualizuje (daje +1 do pola) positiveReactionCount

RequiredNickname
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 646
1

Klasyczny przykład fiksowania problemów które programista sam sobie stworzył (używając JPA) ;)

Napisz sobie JPQL (lub native query) coś w stylu:

Kopiuj
@Query("SELECT new com.example.ReactionCount(cr.reaction, COUNT(cr)) " +
       "FROM CommentReaction cr WHERE cr.comment.id = :commentId " +
       "GROUP BY cr.reaction ORDER BY cr.reaction")
List<ReactionCount> countReactionsForComment(@Param("commentId") Long commentId);

I przerzuć obowiązek agregacji i zliczania na bazę danych.

Co do tych formuł hibernetowych to. nie używałem nigdy ale nie podoba mi się to ;)
W encji wolałbym trzymać dane a to jak gadam z db wolałbym zostawić na poziomie repozytoriów.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.