NHibernate Native SQL несколько соединений - PullRequest
2 голосов
/ 15 марта 2010

У меня проблемы с Nhibernate и собственным sql.

У меня есть объект со множеством коллекций, и я выполняю полнотекстовый поиск по SQL. Поэтому, возвращая около 100 сущностей, я не хочу, чтобы все коллекции загружались лениво. Для этого я изменил свой 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 

Вот как я настраиваю запрос:

        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>();

Что происходит сейчас, так это то, что запрос возвращает клиентов дважды (или более), я предполагаю, что это из-за объединений, поскольку для каждого адреса клиента, CommunicationItem (например, телефон, электронная почта), возвращается новая строка sql. В этом случае я думал, что могу использовать 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>();

При этом выдается исключение. Это потому, что я пытаюсь составить список клиентов .List<Customer>(), но преобразователь возвращает только объекты последнего добавленного соединения. Например. в приведенном выше случае сущность с псевдонимом «comt» возвращается при выполнении .List() вместо .List<Customer>(). Если бы я переключил последнее соединение с псевдонимом соединения "cty", то преобразователь возвращает список только городов ...

Кто-нибудь знает, как я могу вернуть чистый список клиентов в этом случае?

Ответы [ 2 ]

1 голос
/ 06 января 2011

попробуйте

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 голосов
/ 30 июля 2011
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>();

Надеюсь, это поможет. Или вы можете написать нужный запрос SQL под

GetCurrentSession.CreateSqlQuery(sqlquery).List<Customer>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...