Dynamique requête HQL à l'aide de requêtes hql expressions plutôt que des Critères?

Je suis en train d'écrire une partie dynamique requête HQL sans avoir recours à l'API des Critères pour diverses raisons. Je voulais savoir si il existe un moyen facile de court-circuit où restriction à l'aide de HQLs expressions. Pour exemple, voici l'original de la requête qui fonctionne très bien:

SELECT customer 
FROM Customer as customer 
INNER JOIN customer.profile as profile 
WHERE profile.status IN :statusCodes
AND   profile.orgId IN :orgIds

StatusCodes est une liste de Chaînes et orgIds est une liste d'Entiers. Cependant, l'un des deux est facultatif et ne doit pas limiter si la valeur null est passé à la place d'une collection. J'ai essayé d'accomplir cette manière:

SELECT customer 
FROM Customer as customer 
INNER JOIN customer.profile as profile 
WHERE (:statusCodes IS NULL OR profile.status IN :statusCodes)
AND   (:orgIds IS NULL OR profile.orgId IN :orgIds)

Cela ne fonctionnait pas, malheureusement, mais est-il une autre approche qui pourrait fonctionner, soit avec l'aide de différentes expressions ou de passage dans les valeurs par défaut?

EDIT: Juste pour être clair, je suis à la recherche d'une façon d'utiliser une NamedQuery, pas dynamiquement la construction de la requête d'une quelconque manière.

SOLUTION: j'ai utilisé le supplément de paramètres de requête pour l'accomplir. J'ai créé deux méthodes d'aide:

private void setRequiredParameter(TypedQuery<?> query, String name, Object value) {
    query.setParameter(name, value);
}

private void setOptionalParameter(TypedQuery<?> query, String name, Object value) {
    query.setParameter(name, value);
    query.setParameter(name + "Optional", value == null ? 1 : 0);
}

Et la requête comme ceci:

SELECT customer 
        FROM Customer as customer 
        INNER JOIN  customer.profile as profile 
        WHERE (:statusCodesOptional = 1 OR profile.status IN :statusCodes)
        AND (:orgIdsOptional = 1 OR profile.orgId  IN :orgIds)

OriginalL'auteur ant-depalma | 2012-05-17