2010-03-12 6 views
5

J'ai une question Hibernate HQL. J'aimerais écrire une sous-requête en tant que table dérivée (pour des raisons de performances). Est-ce possible de faire ça en HQL? Exemple:Sous-requête utilisant une table dérivée dans Hibernate HQL

FROM Customer WHERE country.id in 
(SELECT id FROM (SELECT id FROM Country where type='GREEN') derivedTable) 

(BTW, ceci est juste une exemple de requête afin de ne pas donner des conseils sur la réécriture, est tout simplement le concept de table dérivée Je suis intéressé)

Répondre

2

Malheureusement non, les tables dérivées ne travaille pas actuellement en HQL. Par exemple, les travaux suivants:

List<int> result = 
    nHSession.CreateQuery(@"select distinct Id from User u") 
    .List<int>().ToList(); 

... ce qui suit jette la cette exception: Exception de type 'Antlr.Runtime.NoViableAltException' a été jeté. à proximité de la ligne 1, colonne 24 [Select distinct de (u sélectionner à partir de S2.BP.Model.User u)]

List<int> result = nHSession.CreateQuery(
    @"select distinct Id from (select u from User u)") 
    .List<int>().ToList(); 

Le repli serait de créer une requête nommée contenant SQL brut ou créer une procédure stockée et l'appeler via une requête nommée, comme ceci:

List<int> result = nHSession.GetNamedQuery("spUserIds") 
    .SetInt32("id", 3) 
    .List<int>().ToList();