2010-04-08 74 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); 
相关问题