Это всегда зависит от ваших занятий, а не от ваших столов. Помните, что вы используете ORM и работаете с моделью класса.
Предполагается, что ваши занятия выглядят так:
class Node
{
List<Node> Relations { get; private set; }
List<Node> InverseRelations { get; private set; }
}
Вы можете отобразить это так:
<class name="Node">
<!-- .... -->
<bag name="Relations" table="NodeRelation">
<key name="Fk_linkOne">
<many-to-many class="Node" column="Fk_linkTwo"/>
</bag>
<bag name="InverseRelations" table="NodeRelation" inverse="true">
<key name="Fk_linkTwo">
<many-to-many class="Node" column="Fk_linkOne"/>
</bag>
</class>
Таким образом, вы получаете асимметричные отношения (это означает: когда Узел A связан с Узлом B, B не обязательно связан с A, за исключением, конечно, InverseRelation). Я не знаю, что вам действительно нужно, так что это предположение, основанное на дизайне вашей базы данных.
Ваш запрос может выглядеть так:
from Node n
where
:x in elements(n.Relations)
or :x in elements(n.InverseRelations)
Примечание: x - это тип сущности, а не просто идентификатор (вам нужно загрузить его, используя session.Load<Node>(84)
),
Другой способ для сами запроса:
select distinct n
from Node n
inner join n.Relations e1
inner join n.InverseRelations e2
where e1.id = 84 or e2.id = 84
Или другим способом без использования обратных соотношений:
select n
from Node n, Node n2 inner join n.Relations e
where
(n = n2 and e.id = 84)
OR (n = e and n2.id = 84)
В критериях я бы взял второе решение и напишите его так:
session.CreateCriteria<Node>("n")
.SetProjection(Projections.Distinct("n"))
.CreateCriteria("Relations", "e1")
.CreateCriteria("InverseRelations", "e2")
.Add(Expression.Or(
Expression.Eq("e1.id", 84),
Expression.Eq("e2.id", 84));