2015-04-25 9 views
7

के साथ पिवट-जैसे परिणाम हमारे प्रोजेक्ट में हम जेपीए 2, स्प्रिंग डेटा और क्वेरीडीएसएल का उपयोग कर रहे हैं। मैं निम्न तालिकाओं और संबंधित जेपीए संस्थाओं है: Actitivy के लिएजेपीए/क्वेरीडीएसएल

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 ActivityName करने के लिए - एक गतिविधि अलग-अलग नाम हो सकता है (चल जैसे, जॉगिंग)

एक व्यक्ति के लिए एक निश्चित स्तर हो सकता है एक दी गई गतिविधि और कई गतिविधियों को परिभाषित कर सकती है (प्रत्येक परिभाषित स्तर के साथ)।

  • गतिविधि नाम (जैसे आदि चल) पैरामीटर के रूप में के साथ एक खोज (गतिविधि नामों की सूची) एक परिणाम के सभी व्यक्तियों को पाया जाना चाहिए, जो संबंधित अभ्यास को पूरा के रूप में
  • होनी चाहिए।
  • परिणाम सभी गतिविधियों उनकी संगत स्तर, व्यक्ति का नाम और व्यक्तियों की गतिविधियों के समग्र राशि

उदाहरण निम्न डेटा के साथ के लिए खोज में शामिल करना चाहिए:

  • व्यक्ति = (आईडी = 1 , नाम = बॉब)
  • व्यक्ति = (आईडी = 2, नाम = मैरी)
  • गतिविधि = (1, ...)
  • गतिविधि = (2, ...)
  • 01,235,
  • ActivityName = (activity_id = 1, नाम = "जॉगिंग")
  • ActivityName = (activity_id = 1, नाम = "चल")
  • ActivityName = (activity_id = 2, नाम = "नाच")
  • ActivityLevel = (person_id = 1, activity_id = 1, स्तर = 0.7f)
  • ActivityLevel = (person_id = 1, activity_id = 2, स्तर = 0.1f)
  • ActivityLevel = (person_id = 2, activity_id = 1, स्तर = 0.5 एफ)

"चल रहे लोगों के लिए खोज रहे हैं "या" नाच "इस तरह एक परिणाम मिलना चाहिए:

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

मेरे प्रश्न: वहाँ एक जेपीए QL/QueryDSL तरीके के साथ एक अभिव्यक्ति/प्रक्षेपण इस तरह के एक परिणाम प्राप्त करने के है? मेरे पास पहले से ही एक बहु-चरण समाधान है - गतिविधि नाम और स्तर का चयन करना, समूह बनाना और जावा 8 के साथ योग करना। अगर मैं querydsl के साथ समूहबद्ध करता हूं, तो मुझे एकल स्तर की प्रविष्टियां नहीं मिलती हैं। इसके विपरीत, मेरे समाधान में मुझे कई अन्य कदम उठाने पड़ते हैं।

यह जानना अच्छा होगा कि यह क्वेरी का उपयोग करके संभव है या नहीं।

उत्तर

2

शुद्ध जेपीए & क्वेरीरीएस केवल इकाइयों के साथ काम करता है। तो आप एक डीबी व्यू बना सकते हैं जो उस डेटा को जोड़ता है जिसे आप ढूंढ रहे हैं और उसे एक नई इकाई में मैप करें, जिसे आप बस पूछ सकते हैं।

एक और समाधान QueryDsl के मूल जेपीए क्वेरी समर्थन का उपयोग करना है। http://www.querydsl.com/static/querydsl/3.6.1/reference/html/ch02.html नीचे आधा देखें। आपको निम्नतम पैराग्राफ (क्वेरी और परियोजना डीटीओ में) की आवश्यकता होगी।डाटाबेस (स्कीमा) (i अनिश्चित क्यों कि आवश्यक है हूँ, लेकिन यह डॉक्स में है)

  • कॉम का उपयोग कर एक प्रश्न का निर्माण करने के लिए इंगित करके

    • उत्पन्न क्यू कक्षाएं:

      यह करने पर निर्भर करता .mysema.query.jpa.sql.JPASQLQuery वर्ग

    • सूची विधि
    • एक डीटीओ सेम कक्षा बनाएं जो आप परिणाम पेश कर सकती हैं करने के लिए
    • परियोजना परिणाम में क्वेरी से सभी आवश्यक परिणाम क्षेत्र सूचीबद्ध करना सुनिश्चित करें वें ई डीटीओ कक्षा
  • +0

    आपके उत्तर के लिए धन्यवाद। इस मामले में एक गतिशील डीबी कैसे काम करना चाहिए? क्षमा करें, मैं इससे परिचित नहीं हूं। – swinkler