如何编写使用个createCriteria以下SQL:

SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id)
有帮助吗?

解决方案 3

我计算出如何使用IsNotEmpty表达做到这一点。在这里它是使用NHibernate LAMBDA扩展:

Session.CreateCriteria<FooBar>()
    .Add(SqlExpression.IsNotEmpty<FooBar>(x => x.Bazes))
    .List<FooBar>();

其他提示

下面是你如何做到这一点:

var fooBars = Session.CreateCriteria<FooBar>()
        .Add(Restrictions.IsNotEmpty("Bazs")).List<FooBar>();

...在FooBar的对象假设有一个集合属性(一到多)“Bazs”。

或者,也可以使用已分离的标准类似的:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
        .SetProjection(Projections.Property("baz.FooBarId"))
        .Add(Restrictions.EqProperty("baz.FooBarId", "fooBar.Id"));

var fooBars = Session.CreateCriteria<FooBar>("fooBar")
        .Add(Subqueries.Exists(dCriteria)).List<FooBar>();

刚走解决了相关的问题,并最终到达我想我会分享这里的答案的解决方案:

假设你想要的原始查询的问题,与在子查询中的附加条件:

SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id
              AND Quantity = 5)

假设你对巴兹类到父的引用,调用,说FooBarRef [在流利地图类你使用引用()方法],可以创建查询,如下所示:

DetachedCriteria dCriteria = DetachedCriteria.For<Baz>("baz")
        .SetProjection(Projections.Property("baz.FooBarId"))
        .Add(Expression.EqProperty("this.FooBarId", "FooBarRef.Id"))
        .Add(Expression.Eq("baz.Quantity", 5));

var fooBars = Session.CreateCriteria<FooBar>("fooBar")
        .Add(Subqueries.Exists(dCriteria)).List<FooBar>();

我不是100%确信有关别名“本”,这是别名NHibernate的自动分配到查询根实体(表)的硬编码,但它是我发现引用的唯一途径从子查询中的父查询的表中的键。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top