使用 QueryExpressionPlan 将提示传递给 nhibernate

Passing hint to nhibernate using QueryExpressionPlan

我正在使用 NHibernate 的 QueryExpressionPlan 将 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 和 returns 逗号分隔格式的记录中,如下所示。

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。

是的,您可以使用 HQL 语句中的 inner join 在 NHibernate 代码中定义 join。查看文档中的 15.3. Associations and joins

请记住,HQLHibernate 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>();