문제

CreateCriteria를 사용하여 다음 SQL을 어떻게 작성할 수 있습니까?

SELECT * FROM FooBar fb
WHERE EXISTS (SELECT FooBarId FROM Baz b WHERE b.FooBarId = fb.Id)
도움이 되었습니까?

해결책 3

나는 istonempty 표현을 사용하여 이것을하는 방법을 해결했습니다. 여기에서는 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)

BAZ 클래스에 대해 부모에 대한 참조가 있다고 가정하면, fooBarref [fluent map 클래스에서 참조 () 메소드를 사용하는 유창한지도 클래스]에서 다음과 같이 쿼리를 만듭니다.

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>();

나는 쿼리의 root 엔티티 (테이블)에 자동으로 할당되는 별칭 "this"의 별칭 "this"의 하드 코딩에 대해 100% 확신하지는 않지만, 내가의 키를 참조하는 유일한 방법입니다. 하위 쿼리 내부의 부모 쿼리 테이블.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top