2015-04-25 16 views
7

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.

Trả lời

2

JPA tinh khiết & QueryDsl chỉ hoạt động với các thực thể. Vì vậy, bạn có thể thực hiện chế độ xem db tổng hợp dữ liệu bạn đang tìm kiếm và ánh xạ dữ liệu đó đến một thực thể mới mà bạn có thể truy vấn đơn giản.

Một giải pháp khác là sử dụng hỗ trợ truy vấn gốc của QueryDsl. Xem http://www.querydsl.com/static/querydsl/3.6.1/reference/html/ch02.html nửa dưới. Bạn sẽ cần đoạn văn thấp nhất (Truy vấn và dự án vào DTO).

Nó nắm tới:

  • Tạo lớp Q bằng cách chỉ vào db (schema) (tôi không chắc chắn lý do tại sao đó là cần thiết, nhưng đó là trong các tài liệu)
  • Xây dựng một truy vấn bằng cách sử dụng com .mysema.query.jpa.sql.JPASQLQuery lớp
  • Hãy chắc chắn để liệt kê tất cả lĩnh vực kết quả cần thiết từ các truy vấn trong phương pháp danh sách
  • Tạo một lớp đậu dto mà bạn có thể chiếu kết quả
  • Dự án kết quả đến th e dto class
+0

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

Các vấn đề liên quan