Chúng tôi đang sử dụng JPA2, dữ liệu mùa xuân và QueryDSL trong dự án của chúng tôi. Tôi có bảng sau đây và các tổ chức có liên quan JPA:Kết quả giống như Pivot với 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 cho Actitivy để ActivityName - một hoạt động có thể có tên gọi khác nhau (ví dụ như chạy, chạy bộ)
Một người có thể có một mức độ nhất định cho một hoạt động nhất định và có thể thực hiện một số hoạt động (mỗi hoạt động với một mức xác định).
- Nên có một tìm kiếm với tên hoạt động (ví dụ chạy vv) như các thông số (một danh sách tên hoạt động)
- Như một kết quả tất cả mọi người nên tìm thấy người thực hiện các hoạt động liên quan.
- Kết quả sẽ chứa tất cả các hoạt động tìm kiếm với mức độ tương ứng của họ, tên của người đó và tổng tổng thể của hoạt động người
Ví dụ dữ liệu sau:
- Person = (id = 1 , tên = Bob)
- Person = (id = 2, name = Mary)
- Hoạt động = (1, ...)
- Hoạt động = (2, ...) 01.235.
- ActivityName = (activity_id = 1, name = "chạy bộ")
- ActivityName = (activity_id = 1, name = "chạy")
- ActivityName = (activity_id = 2, name = "nhảy múa")
- ActivityLevel = (Person_Id = 1, activity_id = 1, level = 0.7f)
- ActivityLevel = (Person_Id = 1, activity_id = 2, mức = 0.1f)
- ActivityLevel = (Person_Id = 2, activity_id = 1, mức = 0.5f)
Tìm kiếm những người đang "chạy "Hoặc 'nhảy múa' sẽ nhận được một kết quả như thế này:
Person[Name] ActitiyName ActivityLevel ActitiyName ActivityLevel Sum
Bob running 0.7 dancing 0.1 0.8
Mary running 0.5 0.5
Câu hỏi của tôi: Có cách nào JPA QL/QueryDSL để có được một kết quả như vậy với một biểu/chiếu? Những gì tôi đã có là một giải pháp nhiều bước - chọn tên và cấp độ hoạt động, thực hiện việc nhóm và tổng hợp với Java8. Nếu tôi làm nhóm với querydsl, tôi không nhận được các mục cấp độ duy nhất. Ngược lại, trong giải pháp của tôi, tôi phải thực hiện một số bước khác.
Sẽ thật tuyệt nếu biết điều này có thể chỉ bằng cách sử dụng truy vấn.
Cảm ơn câu trả lời của bạn. DB nên hoạt động như thế nào trong trường hợp này? Xin lỗi, tôi không quen với điều này. – swinkler