2010-04-08 79 views
5

我遇到了使用DetachedCriteria將JOIN添加到子查詢的問題。代碼看起來大致是這樣的:Hibernate Criteria:在子查詢/ DetachedCriteria中執行JOIN

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)); 

但登錄SQL不包含在子查詢的JOIN,但不包括被拋出一個錯誤

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?


@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'和'Models'的定義和映射嗎? – 2010-04-12 08:17:59

回答

2

不要你在下面的行代碼中的一個錯字:

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

我想,你應該在子標準,而不是標準添加此限制。

0

如果你需要連接子查詢中的表,你可以試試這個。它明確指定分離標準中的joinType。

subCriteria.createAlias("model.modelLanguages", "modelLang", CriteriaSpecification.LEFT_JOIN); 
subCriteria.createAlias("modelLang.language", "lang", CriteriaSpecification.LEFT_JOIN); 
相關問題