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?