Передача подсказки в nhibernate с помощью QueryExpressionPlan - PullRequest
1 голос
/ 31 января 2020

Я использую QueryExpressionPlan от NHibernate для преобразования языка запросов Hibernate в SQL.

Вот пример кода в C#:

var hql = SELECT _table0.Id FROM MyTable1 _table0 WHERE 1=1 and _table0.Address.ZipCode  LIKE   '%58745%' ;

var sql = NHibernate.Engine.Query.QueryExpressionPlan
                 (new StringQueryExpression(hql), false, session.EnabledFilters, sessionFactory) ;

Вот сгенерированный SQL. NHibernate не может добавить INNER JOIN к сгенерированному SQL и возвращает записи в формате через запятую, как показано ниже.

select myTable1.AssetId as col_0_0_ from MyTable1 myTable1, Address address1_ 
    where myTable1.AddressId=address1_.AddressID 
    and 1=1 and (address1_.ZipCode like '%58745%');

Мой запрос - это то, что я должен добавить к QueryExpression, чтобы он автоматически добавлял внутреннее соединение с сгенерированным sql.

Или NHibernate не добавит INNER JOIN сам по себе, и каким-то образом мне нужно самому получить эту информацию и передать ее в NHibernate.

1 Ответ

1 голос
/ 31 января 2020

Да, вы можете определить join в коде NHibernate, используя inner join в операторе HQL. Посмотрите на 15.3. Associations and joins в документации.

Помните, что HQL - это Hibernate Query Language, и оно основано на вашей модели сущности (сопоставленные классы), а не на вашей модели отношений (таблицы).

Запомните, чтобы связать параметры с ваше заявление hql и установить его на сессии. Для образца:

var hql = "SELECT e.Id FROM MyEntity e 
           INNER JOIN e.Address a 
           WHERE a.ZipCode  LIKE :zipCode";

var zipCodeData = "58745";

var result = session.CreateQuery(hql)
                    .SetParameter("zipCode", $"%{zipCodeData}%")
                    .List<int>();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...