简体   繁体   English

HQL中的Linq“ .any”等效项

[英]Linq “.any” equivalent in HQL

I have a NHibernate Linq query and I need to translate it to HQL: 我有一个NHibernate Linq查询,我需要将其翻译为HQL:

var result = Conexion.Session.Query<Person>();
result = result.Where(p => p.addresses.Any(a => a.City.Name == "mycity"));

Returns the people who have at least one adress in the city "MyCity" 返回在“ MyCity”城市中至少具有一个地址的人

How I can translate the "any" clause to "HQL sintax"? 如何将“ any”子句转换为“ HQL sintax”?

Thanks. 谢谢。

This is the HQL equivalent: 这是HQL等效项:

select p 
from Person p
join p.addresses a
join a.city c
where c.name = :cityName

The any is simply resolved by the one-to-many join where condition. 只要通过一对多连接where条件即可解决任何问题。

If there are multiple addresses within the same City, to remove Person entity duplicates, you need to use distinct : 如果在同一城市内有多个地址,要删除“人物”实体重复项,您需要使用distinct

select distinct p 
from Person p
join p.addresses a
join a.city c
where c.name = :cityName

or 要么

select distinct p 
from Address a 
join fetch a.person p 
join a.city c 
where c.name = :cityName

To replicate the SQL generated by: 复制由以下人员生成的SQL:

var result = Conexion.Session.Query<Person>();
result = result.Where(p => p.addresses.Any(a => a.City.Name == "mycity"));

we have to do it like this: 我们必须这样做:

var hql = "SELECT p FROM Person p WHERE EXISTS "
          + "(SELECT a FROM Address a "
          + "  LEFT JOIN a.City c "
          + "  WHERE p = a.Person " 
          + "    AND c.Name = 'mycity') ";

mycity could be even parameter: mycity 甚至可以是参数:

var hql = "SELECT p FROM Person p WHERE EXISTS "
          + "(SELECT a FROM Address a "
          + "  LEFT JOIN a.City c "
          + "  WHERE p = a.Person " 
          + "    AND c.Name = :mycity) ";

var result = Conexion.Session.CreateQuery(hql)
        .SetParameter("mycity", "...")
        .List<Person()

That will work, in case, that Address has a back reference to Person , because that is part of condition WHERE p = a.Person 如果该Address具有对Person的反向引用,那将起作用,因为这是条件WHERE p = a.Person

In case, that mapping contains only way from Person to Address, hql must be like this: 如果该映射仅包含从“人”到“地址”的方式,则hql必须像这样:

var hql = "SELECT p FROM Person p WHERE EXISTS "
          + "(SELECT p2 FROM Person p2 "
          + "  LEFT JOIN p2.addresses a "
          + "  LEFT JOIN a.City c "
          + "  WHERE p = p2 " 
          + "    AND c.Name = :mycity) ";

That will work even if the referenc from address to person is missing 即使缺少从地址到人员的推荐信,也可以使用

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM