[英]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.