2015-04-25 18 views
7

Projemizde JPA2, Spring Data ve QueryDSL kullanıyoruz. Aşağıdaki tablolar ve ilgili JPA varlık vardır: ActivityName için Actitivy içinPivot benzeri sonuç JPA/QueryDSL ile

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 - bir faaliyet (örneğin koşu çalıştıran) adı farklı olabilir

bir kişi için belirli bir seviyeye sahip olabilir Belirli bir aktivite ve çeşitli aktiviteleri (her biri tanımlanmış bir seviyeye) perfomlayabilir.

  • içeren iş yapılırken herkesin bulunmalıdır Sonuç olarak bir parametre olarak faaliyet isimlerin (örneğin vb çalıştıran) sahip arama (faaliyet bir isim listesi)
  • olmalıdır.
  • sonuç tüm faaliyetlerin bunlara karşılık gelen düzeyde, kişinin adı ve kişilerin faaliyetlerinin genel toplamına

Örnek Aşağıdaki veriler ile aramak içerir gerektiğini

  • :

    • Kişi = (id = 1 , isim = Bob)
    • Kişi = (id = 2, isim = Mary)
    • Etkinlik = (1, ...)
    • Etkinlik = (2, ...)
    • ActivityName = (activity_id = 1, adı = "koşu")
    • ActivityName = (activity_id = 1, adı = "çalışan")
    • ActivityName = (activity_id = 2, adı = "dans")
    • activityLevel = (person_id = 1, activity_id = 1, seviye = 0.7f)
    • activityLevel = (person_id = 1, activity_id = 2, seviye = 0.1f)
    • activityLevel = (person_id = 2, activity_id = 1, seviye = 0,52)

    "Çalışan kişiler aranıyor "Ya da 'dans' Böyle bir sonuç almalısınız:

    Person[Name] ActitiyName ActivityLevel ActitiyName ActivityLevel Sum 
    Bob    running   0.7   dancing   0.1  0.8 
    Mary   running   0.5         0.5   
    

    Sorum:bir ifadesi/projeksiyon ile böyle bir netice elde etmek JPA QL/QueryDSL yolu var mı? Zaten sahip olduğum şey, çok adımlı bir çözümdür - aktivite adlarını ve seviyelerini seçerek, gruplandırmayı ve toplamı Java8 ile gerçekleştirir. Querydsl ile gruplama yaparsam, tek düzey girdileri alamıyorum. Tam tersine, benim çözümümde birkaç adım atmam gerekiyor.

    Bunun bir sorgu kullanarak mümkün olup olmadığını bilmek güzel olurdu.

  • cevap

    2

    Salt JPA & QueryDsl yalnızca varlıklar ile çalışır. Böylece, aradığınız verileri bir araya getiren ve basitçe sorgulayabileceğiniz yeni bir öğeyle eşleyen bir db görünümü oluşturabilirsiniz.

    Başka bir çözüm de QueryDsl'ın yerel jpa sorgu desteğini kullanmaktır. Alt yarıda http://www.querydsl.com/static/querydsl/3.6.1/reference/html/ch02.html'a bakın. En düşük paragrafa ihtiyacınız olacaktır (Sorgu ve DTO'ya yansıtın).db (şema) (yani ihtiyaç duyulan neden ben emin değilim, ama docs öyle)

  • com kullanarak bir sorgu Construct işaret ederek

    • üret S sınıfları:

      O aşağı kaynar .mysema.query.jpa.sql.JPASQLQuery sınıf

    • liste yöntemiyle
    • Eğer bir sonuç
    • Projesi sonucu yansıtabilirsiniz hangi bir dto fasulye sınıf oluşturun içinde sorgudan gerekli tüm sonuç alanını listelemek için emin olun inci e dt Sınıfı
  • +0

    Cevabınız için teşekkür ederiz. Dinamik bir DB bu durumda nasıl çalışır? Üzgünüm, buna aşina değilim. – swinkler