2011-06-08 15 views
7

मैं एक संघ द्वारा मैप है निम्नलिखित:हाइबरनेट OneToMany मापदंड रिटर्न डुप्लिकेट

@Entity 
public class Parent 
{ 
... 
    @Id 
    @Column(name = "parent_id") 
    private Long id; 

    @OneToMany(mappedBy = "parent") 
    @OrderBy("id") 
    private List<Child> children; 
... 
} 

@Entity 
public class Child 
{ 
... 
    @Id 
    @Column(name = "child_id") 
    private Long id; 

    @ManyToOne 
    @NotFound(action = NotFoundAction.IGNORE) 
    @JoinColumn(name = "parent_id") 
    private Parent parent; 

    @Column 
    private Boolean enabled; 
... 
} 

मैं मानदंड एपीआई का उपयोग करने Parent संस्थाओं जो एक या अधिक Child साथ संस्थाओं वाले साइट के सभी की एक सूची प्रदान करना चाहते हैं विशेषता enabled=false। मैं क्वेरी द्वारा फ़िल्टर किए जाने के लिए मैप किए गए children संग्रह को पसंद नहीं करूंगा।

उदाहरण के लिए

, निम्नलिखित दिया:

Criteria crit = session.createCriteria(Parent.class); 
crit.createCriteria("children").add(Restrictions.eq("enabled", false)); 
List<Parent> result = crit.list(); 
return result; 

हालांकि: अब तक मैं निम्नलिखित मानदंड क्वेरी का उपयोग कर रहा

Parent A 
    - Child A enabled=true 
    - Child B enabled=false 

Parent B 
    - Child A enabled=false 
    - Child B enabled=false 

:

Parent A 
    - Child A enabled=true 
    - Child B enabled=false 

Parent B 
    - Child A enabled=false 
    - Child B enabled=false 

Parent C 
    - Child A enabled=true 
    - Child B enabled=true 

क्वेरी निम्नलिखित लौटना चाहिए यह

के समतुल्य लौट रहा है
Parent A 
    - Child A enabled=true 
    - Child B enabled=false 

Parent B 
    - Child A enabled=false 
    - Child B enabled=false 

Parent B 
    - Child A enabled=false 
    - Child B enabled=false 

Ie, इसके साथ प्रत्येक बच्चे तत्व के लिए (आबादी वाले बच्चों संग्रह के साथ) एक एकल अभिभावक रिकॉर्ड लौटा रहा है enabled=false

किसी को भी पता है कि कैसे केवल इस परिदृश्य में अद्वितीय माता पिता तत्वों वापस जाने के लिए?

सलाह की सराहना की, पी।

उत्तर

12

आपको distinct जोड़ने की आवश्यकता है, उदा।

criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); 

अपने मामले में काम करना चाहिए

संबंधित मुद्दे