2010-03-15 8 views
2

I "m ayant des problèmes avec NHibernate et sql natif.NHibernate multiples SQL natif rejoint

J'ai une entité avec beaucoup de collections et je fais une recherche SQL texte intégral sur elle. Ainsi, lors du retour 100 si les entités, je ne veux pas que toutes les collections soient paresseux chargé Pour cela, je changé ma requête SQL.

SELECT Query.* 
FROM  (SELECT {spr.*}, 
       {adr.*}, 
       {adrt.*}, 
       {cty.*}, 
       {com.*}, 
       {comt.*},     
       spft.[Rank] AS [Rak], 
       Row_number() OVER(ORDER BY spft.[Rank] DESC) AS rownum 
      FROM customer spr 
       INNER JOIN CONTAINSTABLE (customerfulltext , computedfulltextindex , '" + parsedSearchTerm + @"') AS spft 
        ON spr.customerid = spft.[Key] 
       LEFT JOIN [Address] adr 
        ON adr.customerid = spr.customerid 
       INNER JOIN [AddressType] adrt 
        ON adrt.addresstypeid = adr.addresstypeid 
       INNER JOIN [City] cty 
        ON cty.cityid = adr.cityid 
       LEFT JOIN [Communication] com 
        ON com.customerid = spr.customerid 
       INNER JOIN [CommunicationType] comt 
        ON comt.communicationtypeid = com.communicationtypeid) as Query 
ORDER BY Query.[Rank] DESC 

Voici comment je configurer la requête:

 var items = GetCurrentSession() 
      .CreateSQLQuery(query) 
      .AddEntity("spr", typeof(Customer)) 
      .AddJoin("adr", "spr.addresses") 
      .AddJoin("adrt", "adr.Type") 
      .AddJoin("cty", "adr.City") 
      .AddJoin("com", "spr.communicationItems") 
      .AddJoin("comt", "com.Type") 
      .List<Customer>(); 

que se passe maintenant est que le Québec ry renvoie des clients deux fois (ou plus), je suppose que c'est à cause des jointures puisque pour chaque adresse de client, communicationItem (par ex. téléphone, email), une nouvelle ligne sql est renvoyée. Dans ce cas, j'ai pensé que je pourrais utiliser le DistinctRootEntityResultTransformer.

 var items = GetCurrentSession() 
      .CreateSQLQuery(query) 
      .AddEntity("spr", typeof(Customer)) 
      .AddJoin("adr", "spr.addresses") 
      .AddJoin("adrt", "adr.Type") 
      .AddJoin("cty", "adr.City") 
      .AddJoin("com", "spr.communicationItems") 
      .AddJoin("comt", "com.Type") 
      .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
      .List<Customer>(); 

Une exception est levée. En effet, j'essaie de lister les clients .List<Customer>() mais le transformateur ne renvoie que les entités de la dernière jointure ajoutées. Par exemple. dans le cas ci-dessus, l'entité avec l'alias "comt" est retournée en faisant .List() au lieu de .List<Customer>(). Si je devrais basculer la dernière jointure avec l'alias de jointure "cty", alors le transformateur retourne une liste de villes seulement ...

Quelqu'un sait comment je peux renvoyer une liste propre de clients dans ce cas?

Répondre

1

essayer cette

var items = GetCurrentSession()  
.CreateSQLQuery(query)    
.AddEntity("spr", typeof(Customer))    
.AddJoin("adr", "spr.addresses")    
.AddJoin("adrt", "adr.Type")    
.AddJoin("cty", "adr.City")    
.AddJoin("com", "spr.communicationItems")    
.AddJoin("comt", "com.Type") 
.AddEntity("spr", typeof(Customer))       
.SetResultTransformer(new DistinctRootEntityResultTransformer())    
.List<Customer>(); 
0
GetCurrentSession.CreateQuery("select distinct spr from Customer spr inner join spr.Addresses 
adr inner join adr.Type adrt inner join adr.City cty inner join apr.CommunicationItems com 
inner join com.Type comt").List<Customer>(); 

Hope this helps. Ou vous pouvez écrire la requête SQL souhaitée sous

GetCurrentSession.CreateSqlQuery(sqlquery).List<Customer>();