Nous utilisons JPA2, Spring Data et QueryDSL dans notre projet. J’ai les tables suivantes et les entités JPA associées:
table Person (id, ...) table Activity (id, type, ...) @Entity @Configurable public class Activity { @ElementCollection @CollectionTable(joinColumns = @JoinColumn(name = "ACTIVITY_ID")) @NotEmpty @Valid private Set names = new HashSet(); table ActivityName(activity_id, name, ...) @Embeddable @Immutable @Table(uniqueConstraints = @UniqueConstraint(columnNames = "NAME")) public static class ActivityName { ... } table ActivityLevel(person_id, activity_id, level) @Entity @Immutable @Validated public final class ActivityLevel{...}
1..n pour Actitivy to ActivityName – une activité peut avoir des noms différents (par exemple, courir, faire du jogging)
Une personne peut avoir un certain niveau pour une activité donnée et peut effectuer plusieurs activités (chacune avec un niveau défini).
Exemple les données suivantes:
La recherche de personnes qui “courent” ou “dansent” devrait donner un résultat comme celui-ci:
Person[Name] ActitiyName ActivityLevel ActitiyName ActivityLevel Sum Bob running 0.7 dancing 0.1 0.8 Mary running 0.5 0.5
Ma question: Existe – t-il un moyen JPA QL / QueryDSL d’obtenir un tel résultat avec une seule expression / projection? Ce que je possède déjà, c’est une solution en plusieurs étapes: sélection des noms et des niveaux d’activité, exécution du regroupement et de la sum avec Java8. Si je fais le regroupement avec querydsl, je ne reçois pas les entrées de niveau unique. Inversement, dans ma solution, je dois effectuer plusieurs autres étapes.
Ce serait bien de savoir si cela est possible simplement en utilisant une requête.
Pure JPA & QueryDsl ne fonctionne qu’avec des entités. Vous pouvez donc créer une vue de firebase database qui regroupe les données que vous recherchez et les mapper vers une nouvelle entité, sur laquelle vous pouvez simplement effectuer une requête.
Une autre solution consiste à utiliser le support de requête jpa natif de QueryDsl. Voir http://www.querydsl.com/static/querydsl/3.6.1/reference/html/ch02.html la moitié inférieure. Vous auriez besoin du paragraphe le plus bas (Requête et projet dans DTO).
Cela revient à: