Example usage for org.hibernate.criterion CriteriaSpecification LEFT_JOIN

List of usage examples for org.hibernate.criterion CriteriaSpecification LEFT_JOIN

Introduction

In this page you can find the example usage for org.hibernate.criterion CriteriaSpecification LEFT_JOIN.

Prototype

int LEFT_JOIN

To view the source code for org.hibernate.criterion CriteriaSpecification LEFT_JOIN.

Click Source Link

Document

Specifies joining to an entity based on a left outer join.

Usage

From source file:gov.nih.nci.caintegrator.domain.annotation.service.AnnotationManagerImpl.java

License:BSD License

public Map<GeneBiomarker, Collection<GeneExprReporter>> getReportersForGenes(
        AnnotationCriteria annotationCriteria) {
    HashMap<GeneBiomarker, Collection<GeneExprReporter>> reporterMap = new HashMap<GeneBiomarker, Collection<GeneExprReporter>>();

    List<GeneBiomarker> geneList = new ArrayList<GeneBiomarker>();

    Collection<String> genes = annotationCriteria.getGeneSymbols();
    String platform = annotationCriteria.getArrayPlatformName();

    if (platform == null) {
        throw new RuntimeException("Array Platform name cannot be null");
    }/*from  w w w.ja v a2 s .c o m*/
    if (genes == null || genes.isEmpty()) {
        throw new RuntimeException("Gene list must not be empty");
    }

    Session currentSession = sessionFactory.getCurrentSession();
    Criteria criteria = currentSession.createCriteria(GeneBiomarker.class);
    criteria.createAlias("geneExprReporterCollection", "reporter", CriteriaSpecification.LEFT_JOIN);
    if (genes.size() > 1000) {
        for (int i = 0; i < ((genes.size() / 1000) + 1); i++) {

            int size;
            if (i == (genes.size() / 1000)) {
                size = genes.size() % 1000;
            } else {
                size = 1000;
            }
            String[] tempArray = new String[size];
            System.arraycopy(genes.toArray(), i * 1000, tempArray, 0, size);
            Collection tempList = new ArrayList();
            Collections.addAll(tempList, tempArray);
            criteria.add(Restrictions.in("hugoGeneSymbol", tempList));
            criteria.add(Restrictions.eq("reporter.platform", platform));
            geneList.addAll(criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list());

        }
    } else {

        criteria.add(Restrictions.in("hugoGeneSymbol", genes));
        criteria.add(Restrictions.eq("reporter.platform", platform));
        geneList = criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();

    }

    for (GeneBiomarker gene : geneList) {
        reporterMap.put(gene, gene.getGeneExprReporterCollection());
    }

    return reporterMap;
}

From source file:gov.nih.nci.caintegrator.domain.annotation.service.AnnotationManagerImpl.java

License:BSD License

public Map<GeneBiomarker, Collection<VariationReporter>> getVariationReportersForGenes(
        AnnotationCriteria annotationCriteria) {

    HashMap<GeneBiomarker, Collection<VariationReporter>> reporterMap = new HashMap<GeneBiomarker, Collection<VariationReporter>>();

    Collection<String> genes = annotationCriteria.getGeneSymbols();
    String platform = annotationCriteria.getArrayPlatformName();

    if (platform == null) {
        throw new RuntimeException("Array Platform name cannot be null");
    }/*  w ww  . j a  v a 2 s. c o  m*/
    if (genes == null || genes.isEmpty()) {
        throw new RuntimeException("Gene list must not be empty");
    }

    List<VariationReporter> reporterList = new ArrayList<VariationReporter>();
    Session currentSession = sessionFactory.getCurrentSession();
    Criteria criteria = currentSession.createCriteria(VariationReporter.class);
    criteria.createAlias("snpAnnotation", "snp", CriteriaSpecification.LEFT_JOIN);
    criteria.createAlias("snpAnnotation.geneBiomarkerCollection", "gene", CriteriaSpecification.LEFT_JOIN);
    if (genes.size() > 1000) {
        for (int i = 0; i < ((genes.size() / 1000) + 1); i++) {

            int size;
            if (i == (genes.size() / 1000)) {
                size = genes.size() % 1000;
            } else {
                size = 1000;
            }
            String[] tempArray = new String[size];
            System.arraycopy(genes.toArray(), i * 1000, tempArray, 0, size);
            Collection tempList = new ArrayList();
            Collections.addAll(tempList, tempArray);
            criteria.add(Restrictions.in("gene.hugoGeneSymbol", tempList));
            criteria.add(Restrictions.eq("platform", platform));
            reporterList.addAll(criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list());

        }
    } else {

        criteria.add(Restrictions.in("gene.hugoGeneSymbol", genes));
        criteria.add(Restrictions.eq("platform", platform));
        reporterList = criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();

    }

    // Build return map for service
    for (VariationReporter r : reporterList) {
        Collection<GeneBiomarker> genesForReporter = r.getSnpAnnotation().getGeneBiomarkerCollection();
        for (GeneBiomarker b : genesForReporter) {

            if (genes.contains(b.getHugoGeneSymbol())) {

                Collection<VariationReporter> reportersToAdd = null;
                reportersToAdd = reporterMap.get(b);
                if (reportersToAdd == null) {
                    reportersToAdd = new ArrayList<VariationReporter>();

                }
                reportersToAdd.add(r);
                reporterMap.put(b, reportersToAdd);
            }
        }
    }

    return reporterMap;
}

From source file:gov.nih.nci.caintegrator.domain.annotation.service.AnnotationManagerImpl.java

License:BSD License

public Collection<GeneExprReporter> getReportersForPlatform(AnnotationCriteria annotationCriteria) {
    Session currentSession = sessionFactory.getCurrentSession();

    Criteria criteria = currentSession.createCriteria(GeneExprReporter.class);
    criteria.createAlias("geneBiomarkerCollection", "gene", CriteriaSpecification.LEFT_JOIN);
    criteria.createAlias("geneReporterAnnotationCollection", "annotation", CriteriaSpecification.LEFT_JOIN);
    criteria.add(Restrictions.eq("platform", annotationCriteria.getArrayPlatformName()));
    return criteria.list();
}

From source file:gov.nih.nci.caintegrator.domain.annotation.service.AnnotationManagerImpl.java

License:BSD License

public Collection<GeneExprReporter> getReporterAnnotations(AnnotationCriteria annotationCriteria) {
    Collection<String> reporters = annotationCriteria.getReporterIds();

    if (reporters == null || reporters.isEmpty()) {
        throw new RuntimeException("Reporter list must not be empty");
    }//from   ww w.  j  av  a 2  s . c om

    Session currentSession = sessionFactory.getCurrentSession();

    List<GeneExprReporter> reporterList = new ArrayList<GeneExprReporter>();
    if (reporters.size() > 1000) {
        for (int i = 0; i < ((reporters.size() / 1000) + 1); i++) {
            Criteria criteria = currentSession.createCriteria(GeneExprReporter.class);
            criteria.createAlias("geneBiomarkerCollection", "gene", CriteriaSpecification.LEFT_JOIN);
            criteria.createAlias("geneReporterAnnotationCollection", "annotation",
                    CriteriaSpecification.LEFT_JOIN);

            int size;
            if (i == (reporters.size() / 1000)) {
                size = reporters.size() % 1000;
            } else {
                size = 1000;
            }
            String[] tempArray = new String[size];
            System.arraycopy(reporters.toArray(), i * 1000, tempArray, 0, size);
            Collection tempList = new ArrayList();
            Collections.addAll(tempList, tempArray);
            criteria.add(Restrictions.in("name", tempList));
            reporterList.addAll(criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list());
        }
    } else {
        Criteria criteria = currentSession.createCriteria(GeneExprReporter.class);
        criteria.createAlias("geneBiomarkerCollection", "gene", CriteriaSpecification.LEFT_JOIN);
        criteria.createAlias("geneReporterAnnotationCollection", "annotation", CriteriaSpecification.LEFT_JOIN);
        criteria.add(Restrictions.in("name", reporters));
        reporterList = criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
    }

    return reporterList;
}

From source file:gov.nih.nci.cananolab.service.protocol.helper.ProtocolServiceHelper.java

License:BSD License

public List<Protocol> findProtocolsBy(String protocolType, String protocolName, String protocolAbbreviation,
        String fileTitle) throws Exception {
    List<Protocol> protocols = new ArrayList<Protocol>();
    CaNanoLabApplicationService appService = (CaNanoLabApplicationService) ApplicationServiceProvider
            .getApplicationService();/* www  .  ja  va  2s .  c  o  m*/
    DetachedCriteria crit = DetachedCriteria.forClass(Protocol.class);
    crit.createAlias("file", "file", CriteriaSpecification.LEFT_JOIN);

    crit.setFetchMode("file.keywordCollection", FetchMode.JOIN);
    if (!StringUtils.isEmpty(protocolType)) {
        // case insensitive
        crit.add(Restrictions.ilike("type", protocolType, MatchMode.EXACT));
    }
    if (!StringUtils.isEmpty(protocolName)) {
        TextMatchMode protocolNameMatchMode = new TextMatchMode(protocolName);
        crit.add(Restrictions.ilike("name", protocolNameMatchMode.getUpdatedText(),
                protocolNameMatchMode.getMatchMode()));
    }
    if (!StringUtils.isEmpty(protocolAbbreviation)) {
        TextMatchMode protocolAbbreviationMatchMode = new TextMatchMode(protocolAbbreviation);
        crit.add(Restrictions.ilike("abbreviation", protocolAbbreviationMatchMode.getUpdatedText(),
                protocolAbbreviationMatchMode.getMatchMode()));
    }
    if (!StringUtils.isEmpty(fileTitle)) {
        TextMatchMode titleMatchMode = new TextMatchMode(fileTitle);
        crit.add(Restrictions.ilike("file.title", titleMatchMode.getUpdatedText(),
                titleMatchMode.getMatchMode()));
    }
    crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
    List results = appService.query(crit);
    for (int i = 0; i < results.size(); i++) {
        Protocol protocol = (Protocol) results.get(i);
        if (springSecurityAclService.currentUserHasReadPermission(protocol.getId(),
                SecureClassesEnum.PROTOCOL.getClazz())
                || springSecurityAclService.currentUserHasWritePermission(protocol.getId(),
                        SecureClassesEnum.PROTOCOL.getClazz())) {
            protocols.add(protocol);
        } else {
            logger.debug("User doesn't have access ot protocol with id " + protocol.getId());
        }
    }
    return protocols;
}

From source file:gov.nih.nci.cananolab.service.sample.helper.AdvancedSampleServiceHelper.java

License:BSD License

private List<Characterization> findCharacterizationsBy(String sampleId, AdvancedSampleSearchBean searchBean)
        throws Exception {
    List<Characterization> chars = new ArrayList<Characterization>();
    if (searchBean.getCharacterizationQueries().isEmpty()) {
        return chars;
    }/*from   www  .  j  a  v a2 s  . c o m*/
    Long id = new Long(sampleId);
    CaNanoLabApplicationService appService = (CaNanoLabApplicationService) ApplicationServiceProvider
            .getApplicationService();
    if (searchBean.getCharacterizationQueries().size() == 1
            || searchBean.getCharacterizationLogicalOperator().equals("or")) {
        DetachedCriteria crit = DetachedCriteria.forClass(Characterization.class, "rootCrit");
        crit.createAlias("sample", "sample");
        // join finding and datum
        if (searchBean.getHasDatum()) {
            crit.createAlias("findingCollection", "finding", CriteriaSpecification.LEFT_JOIN);
            crit.createAlias("finding.datumCollection", "datum", CriteriaSpecification.LEFT_JOIN);
        }
        crit.add(Restrictions.eq("sample.id", id));
        Disjunction charDisjunction = getCharacterizationDisjunction(searchBean, crit, "");
        crit.add(charDisjunction);
        crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
        List results = appService.query(crit);
        for (int i = 0; i < results.size(); i++) {
            Characterization achar = (Characterization) results.get(i);
            chars.add(achar);
        }
    } else {
        // hibernate doesn't support union have to execute the query one at
        // a time union the result in Java
        for (CharacterizationQueryBean charQuery : searchBean.getCharacterizationQueries()) {
            DetachedCriteria crit = DetachedCriteria.forClass(Characterization.class, "rootCrit");
            crit.createAlias("sample", "sample");
            crit.add(Restrictions.eq("sample.id", id));
            DetachedCriteria subCrit = getCharacterizationSubquery(charQuery, "id");
            crit.add(Subqueries.exists(subCrit));
            crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
            List results = appService.query(crit);
            for (int i = 0; i < results.size(); i++) {
                Characterization achar = (Characterization) results.get(i);
                if (!chars.contains(achar)) {
                    chars.add(achar);
                }
            }
        }
    }
    Collections.sort(chars, new Comparators.CharacterizationNameAssayTypeDateComparator());
    return chars;
}

From source file:gov.nih.nci.cananolab.service.sample.helper.AdvancedSampleServiceHelper.java

License:BSD License

private List<FunctionalizingEntity> findFunctionalizingEntitiesBy(String sampleId,
        AdvancedSampleSearchBean searchBean) throws Exception {
    List<FunctionalizingEntity> entities = new ArrayList<FunctionalizingEntity>();
    if (!searchBean.getHasAgentMaterial()) {
        return entities;
    }//www. jav a  2 s .com
    Long id = new Long(sampleId);
    CaNanoLabApplicationService appService = (CaNanoLabApplicationService) ApplicationServiceProvider
            .getApplicationService();
    DetachedCriteria crit = DetachedCriteria.forClass(FunctionalizingEntity.class);
    Junction junction = getFunctionalizingEntityJunction(searchBean, crit);
    if (junction != null) {
        crit.createAlias("sampleComposition", "comp", CriteriaSpecification.LEFT_JOIN);
        crit.createAlias("comp.sample", "sample", CriteriaSpecification.LEFT_JOIN);
        crit.add(Restrictions.eq("sample.id", id));
        crit.add(junction);
        crit.setFetchMode("functionCollection", FetchMode.JOIN);
        crit.setFetchMode("functionCollection.targetCollection", FetchMode.JOIN);
        crit.setFetchMode("fileCollection", FetchMode.JOIN);
        crit.setFetchMode("fileCollection.keywordCollection", FetchMode.JOIN);
        crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
        List results = appService.query(crit);
        for (int i = 0; i < results.size(); i++) {
            FunctionalizingEntity entity = (FunctionalizingEntity) results.get(i);
            entities.add(entity);
        }
    } else if (searchBean.getFuncEntityCount() > 1) {
        // Hibernate Criteria API doesn't support union, union in java
        for (CompositionQueryBean query : searchBean.getCompositionQueries()) {
            if (query.getCompositionType().equals("functionalizing entity")) {
                crit = DetachedCriteria.forClass(FunctionalizingEntity.class);
                crit.createAlias("sampleComposition", "comp", CriteriaSpecification.LEFT_JOIN);
                crit.createAlias("comp.sample", "sample", CriteriaSpecification.LEFT_JOIN);
                crit.add(Restrictions.eq("sample.id", id));
                DetachedCriteria subCrit = getFunctionalizingEntitySubquery(query, "", "id");
                crit.add(Subqueries.exists(subCrit));
                crit.setFetchMode("functionCollection", FetchMode.JOIN);
                crit.setFetchMode("functionCollection.targetCollection", FetchMode.JOIN);
                crit.setFetchMode("fileCollection", FetchMode.JOIN);
                crit.setFetchMode("fileCollection.keywordCollection", FetchMode.JOIN);
                crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
                List results = appService.query(crit);
                for (int i = 0; i < results.size(); i++) {
                    FunctionalizingEntity entity = (FunctionalizingEntity) results.get(i);
                    if (!entities.contains(entity)) {
                        entities.add(entity);
                    }
                }
            }
        }
    }
    return entities;
}

From source file:gov.nih.nci.cananolab.service.sample.helper.AdvancedSampleServiceHelper.java

License:BSD License

private List<Function> findFunctionsBy(String sampleId, AdvancedSampleSearchBean searchBean) throws Exception {
    List<Function> functions = new ArrayList<Function>();
    if (!searchBean.getHasFunction()) {
        return functions;
    }//w ww.  j  a va 2 s  .  c o m
    Long id = new Long(sampleId);
    CaNanoLabApplicationService appService = (CaNanoLabApplicationService) ApplicationServiceProvider
            .getApplicationService();
    DetachedCriteria crit = DetachedCriteria.forClass(Function.class);
    Junction junction = getFunctionJunction(searchBean, crit);
    if (junction != null) {
        crit.createAlias("composingElement", "ce", CriteriaSpecification.LEFT_JOIN);
        crit.createAlias("ce.nanomaterialEntity", "nanoEntity", CriteriaSpecification.LEFT_JOIN);
        crit.createAlias("nanoEntity.sampleComposition", "comp", CriteriaSpecification.LEFT_JOIN);
        crit.createAlias("comp.sample", "sample", CriteriaSpecification.LEFT_JOIN);
        crit.createAlias("functionalizingEntity", "funcEntity", CriteriaSpecification.LEFT_JOIN);
        crit.createAlias("funcEntity.sampleComposition", "comp2", CriteriaSpecification.LEFT_JOIN);
        crit.createAlias("comp2.sample", "sample2", CriteriaSpecification.LEFT_JOIN);
        crit.add(Restrictions.or(Restrictions.eq("sample.id", id), Restrictions.eq("sample2.id", id)));
        crit.add(junction);
        crit.setFetchMode("targetCollection", FetchMode.JOIN);

        List results = appService.query(crit);
        for (int i = 0; i < results.size(); i++) {
            Function function = (Function) results.get(i);
            functions.add(function);
        }
    } else if (searchBean.getFuncCount() > 1) {
        // Hibernate Criteria API doesn't support union, union in java
        for (CompositionQueryBean query : searchBean.getCompositionQueries()) {
            if (query.getCompositionType().equals("function")) {
                crit = DetachedCriteria.forClass(Function.class);
                crit.createAlias("composingElement", "ce", CriteriaSpecification.LEFT_JOIN);
                crit.createAlias("ce.nanomaterialEntity", "nanoEntity", CriteriaSpecification.LEFT_JOIN);
                crit.createAlias("nanoEntity.sampleComposition", "comp", CriteriaSpecification.LEFT_JOIN);
                crit.createAlias("comp.sample", "sample", CriteriaSpecification.LEFT_JOIN);
                crit.createAlias("functionalizingEntity", "funcEntity", CriteriaSpecification.LEFT_JOIN);
                crit.createAlias("funcEntity.sampleComposition", "comp2", CriteriaSpecification.LEFT_JOIN);
                crit.createAlias("comp2.sample", "sample2", CriteriaSpecification.LEFT_JOIN);
                crit.add(Restrictions.or(Restrictions.eq("sample.id", id), Restrictions.eq("sample2.id", id)));
                DetachedCriteria subCrit = getFunctionSubquery(query, "", "", "id");
                crit.add(Subqueries.exists(subCrit));
                crit.setFetchMode("targetCollection", FetchMode.JOIN);
                crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
                List results = appService.query(crit);
                for (int i = 0; i < results.size(); i++) {
                    Function function = (Function) results.get(i);
                    if (!functions.contains(function)) {
                        functions.add(function);
                    }
                }
            }
        }
    }
    return functions;
}

From source file:gov.nih.nci.cananolab.service.sample.helper.AdvancedSampleServiceHelper.java

License:BSD License

private List<NanomaterialEntity> findNanomaterialEntitiesBy(String sampleId,
        AdvancedSampleSearchBean searchBean) throws Exception {
    List<NanomaterialEntity> entities = new ArrayList<NanomaterialEntity>();
    Long id = new Long(sampleId);
    if (!searchBean.getHasNanomaterial()) {
        return entities;
    }/*from w  ww .  jav  a 2  s. c  om*/
    DetachedCriteria crit = DetachedCriteria.forClass(NanomaterialEntity.class);
    CaNanoLabApplicationService appService = (CaNanoLabApplicationService) ApplicationServiceProvider
            .getApplicationService();
    Junction junction = getNanomaterialEntityJunction(searchBean, crit);
    if (junction != null) {
        // join nanomaterialEntity
        if (searchBean.getHasNanomaterial() && !searchBean.getHasFunction()) {
            if (searchBean.getHasChemicalName()) {
                crit.createAlias("composingElementCollection", "compElement", CriteriaSpecification.LEFT_JOIN);
            }
        }
        crit.createAlias("sampleComposition", "comp");
        crit.createAlias("comp.sample", "sample");
        crit.add(Restrictions.eq("sample.id", id));
        crit.add(junction);
        crit.setFetchMode("fileCollection", FetchMode.JOIN);
        crit.setFetchMode("fileCollection.keywordCollection", FetchMode.JOIN);
        crit.setFetchMode("composingElementCollection", FetchMode.JOIN);
        crit.setFetchMode("composingElementCollection.inherentFunctionCollection", FetchMode.JOIN);
        crit.setFetchMode("composingElementCollection.inherentFunctionCollection.targetCollection",
                FetchMode.JOIN);
        crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
        List results = appService.query(crit);
        for (int i = 0; i < results.size(); i++) {
            NanomaterialEntity entity = (NanomaterialEntity) results.get(i);
            entities.add(entity);
        }
    } else if (searchBean.getNanoEntityCount() > 1) {
        // Hibernate Criteria API doesn't support union, union in java
        for (CompositionQueryBean query : searchBean.getCompositionQueries()) {
            if (query.getCompositionType().equals("nanomaterial entity")) {
                crit = DetachedCriteria.forClass(NanomaterialEntity.class);
                crit.createAlias("sampleComposition", "comp", CriteriaSpecification.LEFT_JOIN);
                crit.createAlias("comp.sample", "sample", CriteriaSpecification.LEFT_JOIN);
                if (!StringUtils.isEmpty(query.getChemicalName())) {
                    crit.createAlias("composingElementCollection", "compElement");
                }
                crit.add(Restrictions.eq("sample.id", id));
                crit.setFetchMode("fileCollection", FetchMode.JOIN);
                crit.setFetchMode("fileCollection.keywordCollection", FetchMode.JOIN);
                crit.setFetchMode("composingElementCollection", FetchMode.JOIN);
                crit.setFetchMode("composingElementCollection.inherentFunctionCollection", FetchMode.JOIN);
                crit.setFetchMode("composingElementCollection.inherentFunctionCollection.targetCollection",
                        FetchMode.JOIN);
                DetachedCriteria subCrit = getNanomaterialEntitySubquery(query, "", "id");
                crit.add(Subqueries.exists(subCrit));
                crit.setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);
                List results = appService.query(crit);
                for (int i = 0; i < results.size(); i++) {
                    NanomaterialEntity entity = (NanomaterialEntity) results.get(i);
                    if (!entities.contains(entity)) {
                        entities.add(entity);
                    }
                }
            }
        }
    }
    return entities;
}

From source file:gov.nih.nci.cananolab.service.sample.helper.AdvancedSampleServiceHelper.java

License:BSD License

private DetachedCriteria getCharacterizationSubquery(CharacterizationQueryBean charQuery,
        String projectionProperty) {
    DetachedCriteria subCrit = DetachedCriteria.forClass(Characterization.class, "subCrit");
    subCrit.setProjection(Projections.distinct(Property.forName(projectionProperty)));
    // join finding and datum
    if (!StringUtils.isEmpty(charQuery.getDatumName())) {
        subCrit.createAlias("subCrit.findingCollection", "finding", CriteriaSpecification.LEFT_JOIN);
        subCrit.createAlias("finding.datumCollection", "datum", CriteriaSpecification.LEFT_JOIN);
    }/* w ww . ja  v a 2s.com*/
    Criterion charCrit = getCharacterizationCriterion(charQuery, "");
    subCrit.add(charCrit);
    subCrit.add(Restrictions.eqProperty("subCrit." + projectionProperty, "rootCrit.id"));
    return subCrit;
}