2010-04-08 19 views
5

Je rencontre un problème avec l'ajout de JOIN à une sous-requête en utilisant DetachedCriteria. Le code ressemble à peu près comme ceci:Critères de mise en veille prolongée: Effectuer JOIN dans la sous-requête/des critères détachés

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

Mais le SQL connecté ne contient pas le JOIN dans la sous-requête, mais ne comprend l'alias qui jette une erreur

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 
) 

Comment puis-je ajouter le se joint à la 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

Pourriez-vous publier la définition et le mappage de 'ProductLine' et' Models'? –

Répondre

2

Ne vous avez une erreur dans votre code à la ligne suivante:

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

Je pense, vous devez ajouter cette restriction sur les sous-critères et non les critères.

0

Si vous avez besoin de joindre des tables dans la sous-requête, vous pouvez essayer de le faire. Il spécifie explicitement joinType dans vos critères détachés.

subCriteria.createAlias("model.modelLanguages", "modelLang", CriteriaSpecification.LEFT_JOIN); 
subCriteria.createAlias("modelLang.language", "lang", CriteriaSpecification.LEFT_JOIN);