2010-04-08 13 views
5

में जॉइन करें I DetachedCriteria का उपयोग करके जॉइन को एक सबक्वायरी जोड़ने के साथ एक समस्या में भाग ले रहा हूं। कोड इस तरह मोटे तौर पर दिखता है:हाइबरनेट मानदंड: सबक्वायरी/डिटेक्टेडक्रिटिया

Criteria criteria = createCacheableCriteria(ProductLine.class, "productLine"); 
criteria.add(Expression.eq("productLine.active", "Y")); 

DetachedCriteria subCriteria = DetachedCriteria.forClass(Model.class, "model"); 
subCriteria.setProjection(Projections.rowCount()); 
subCriteria.createAlias("model.modelLanguages", "modelLang"); 
subCriteria.createAlias("modelLang.language", "lang"); 
criteria.add(Expression.eq("lang.langCode", "EN")); 
subCriteria.add(Restrictions.eqProperty("model.productLine.productLineId","productLine.productLineId")); 
criteria.add(Subqueries.lt(0, subCriteria)); 

लेकिन लॉग इन एसक्यूएल शामिल नहीं है सबक्वेरी में शामिल हों, लेकिन उर्फ ​​जो एक त्रुटि

SELECT * 
FROM PRODUCT_LINE this_ 
WHERE this_.ACTIVE=? 
AND ?     < 
    (SELECT COUNT(*) AS y0_ 
    FROM MODEL this0__ 
    WHERE lang3_.LANG_CODE  ='EN' 
    AND this0__.PRODUCT_LINE_ID  =this_.ID 
) 

मैं कैसे जोड़ सकते हैं फेंक रहा है शामिल है DetachedCriteria में शामिल हो जाता है?

criteria.add(Expression.eq("lang.langCode", "EN")); 

मुझे लगता है, आप subcriteria और नहीं मापदंड पर यह प्रतिबंध जोड़ना चाहिए:


@Entity 
@Table(name = "PRODUCT_LINE") 
public class ProductLine implements java.io.Serializable { 

    private long productLineId; 
    private char active; 
    private Set<Models> models = new HashSet<Models>(0); 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "productLine") 
    public Set<Models> getModels() { 
     return this.models; 
    } 

} 

@Entity 
@Table(name = "MODEL") 
public class Model implements java.io.Serializable { 

    private long modelId; 
    private ProductLine productLine; 
    private String name; 
    private Set<ModelLanguages> modelLanguages = new HashSet<ModelLanguages>(0); 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "PRODUCT_LINE_ID") 
    public ProductLine getProductLine() { 
     return this.productLine; 
    } 

    @Column(name = "NAME", nullable = false) 
    public String getName() { 
     return this.name; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "model") 
    public Set<ModelLanguages> getModelLanguages() { 
     return this.modelLanguages; 
    } 

} 

@Entity 
@Table(name = "MODEL_LANGUAGES") 
public class ModelLanguages implements java.io.Serializable { 

    private long id; 
    private Language language; 
    private Model model; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "LANGUAGE_ID", nullable = false, insertable = false, updatable = false) 
    public Language getLanguage() { 
     return this.language; 
    } 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "MODEL_ID", nullable = false, insertable = false, updatable = false) 
    public Model getModel() { 
     return this.model; 
    } 
} 


@Entity 
@Table(name = "LANGUAGES", uniqueConstraints = @UniqueConstraint(columnNames = "LANG_CODE")) 
public class Language implements java.io.Serializable { 

    private long languageId; 
    private String langCode; 
    private Set<ModelLanguages> modelLanguages = new HashSet<ModelLanguages>(
      0); 

    @Column(name = "LANG_CODE", unique = true, nullable = false) 
    public String getLangCode() { 
     return this.langCode; 
    } 

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "language") 
    public Set<ModelLanguages> getModelLanguages() { 
     return this.modelLanguages; 
    } 
} 

Hibernate version: 3.2.6.ga 
Hibernate core: 3.3.2.GA 
Hibernate annotations: 3.4.0.GA 
Hibernate commons-annotations: 3.3.0.ga 
Hibernate entitymanager: 3.4.0.GA 
Hibernate validator: 3.1.0.GA 
+1

क्या आप 'ProductLine' और' मॉडल 'की परिभाषा और मैपिंग पोस्ट कर सकते हैं? –

उत्तर

2

आप निम्न पंक्ति पर अपने कोड लिखने में कोई गलती नहीं है।

0

यदि आपको सबक्वायरी में टेबल में शामिल होने की आवश्यकता है तो क्या आप इसे बनाने का प्रयास कर सकते हैं। यह स्पष्ट रूप से आपके अलग मानदंडों में शामिल टाइप टाइप कर रहा है।

subCriteria.createAlias("model.modelLanguages", "modelLang", CriteriaSpecification.LEFT_JOIN); 
subCriteria.createAlias("modelLang.language", "lang", CriteriaSpecification.LEFT_JOIN); 
संबंधित मुद्दे