Używamy JPA2, Spring Data i QueryDSL w naszym projekcie. Mam następujące tabele i związane z nimi podmioty WZP:Wynik podobny do przestawnego z JPA/QueryDSL
table Person (id, ...)
table Activity (id, type, ...)
@Entity
@Configurable
public class Activity {
@ElementCollection
@CollectionTable(joinColumns = @JoinColumn(name = "ACTIVITY_ID"))
@NotEmpty
@Valid
private Set<ActivityName> 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 dla Actitivy do ActivityName - działalność może mieć różne nazwy (np bieganie, jogging)
Osoba może mieć pewien poziom dla danej czynności i może wykonywać kilka czynności (każda z określonym poziomem).
- Nie powinno być poszukiwanie z nazwami działalności (na przykład z systemem itp) jako parametrów (lista nazw aktywności)
- W rezultacie wszystkie osoby powinny znajdować wykonujące pokrewne działalności.
- Wynik powinien zawiera wszystkie działania szukać z ich odpowiednim poziomie, nazwisko osoby oraz ogólną sumę działań osób
przykład następujące dane:
- Person = (id = 1 , nazwa = BOB)
- osoby = (id = 2, nazwa = Maria)
- Aktywność = (1, ...)
- Aktywność = (2 ...)
- ActivityName = (activity_id = 1, nazwa = "Jogging")
- ActivityName = (activity_id = 1, nazwa = "uruchomiony")
- ActivityName = (activity_id = 2, nazwa = "tańczyć")
- activityLevel = (person_id = 1, activity_id = 1, poziom = 0.7f)
- activityLevel = (person_id = 1, activity_id = 2, na poziomie = 0.1f)
- activityLevel = (person_id = 2, activity_id = 1, poziom = 0,5f)
Wyszukiwanie osób "biegających" "Lub«taniec»powinien uzyskać wynik takiego:
Person[Name] ActitiyName ActivityLevel ActitiyName ActivityLevel Sum
Bob running 0.7 dancing 0.1 0.8
Mary running 0.5 0.5
Moje pytanie: Czy istnieje sposób JPA QL/QueryDSL aby uzyskać taki wynik z jeden ekspresji/projekcji? To, co już mam, to wielostopniowe rozwiązanie - wybór nazw i poziomów działania, wykonanie grupowania i sumowania za pomocą Java8. Jeśli zrobię zgrupowanie z querydsl, nie otrzymam wpisów pojedynczego poziomu. Na odwrót, w moim rozwiązaniu muszę wykonać kilka innych kroków.
Byłoby miło wiedzieć, czy jest to możliwe za pomocą zapytania.
Dzięki za odpowiedź. Jak powinna działać w tym przypadku dynamiczna baza danych? Przepraszam, nie znam tego. – swinkler