1

プロジェクトとサイトの間に多対多の関係があります。Criteria API を使用してプロジェクトのサイトのリストを取得しようとしています。私はこれを機能させましたが、クエリは関連するプロジェクトのすべての列も選択します。これは望ましくありません。HQL を使用した同等のクエリと思われるものを作成しましたが、サイトの列のみが選択されます。

var target1 = session.CreateQuery("select s from Site s join s.Projects pr where pr.ProjectId = ?")
    .SetInt32(0, projectId)
    .List<Site>();

var target2 = session.CreateCriteria<Site>()
    .CreateAlias("Projects", "pr")
    .Add(Restrictions.Eq("pr.ProjectId", projectId))
    .List<Site>();

Criteria API バージョン (target2) を制限してサイト列のみを選択するにはどうすればよいですか? Projections を使用してみましたが、型を投影する方法がありません。この場合、Criteria API を使用する必要があります。

4

1 に答える 1

1

これが最善の方法かどうかはわかりませんが、SqlProjection を使用して動作するようにしました。

Session.CreateCriteria<T>("foo")
            .CreateAlias("foo.Bar", "bar")
            .SetProjection(Projections.SqlProjection("{alias}.*", new string[] {}, new IType[] {}))
            .SetResultTransformer(new AliasToBeanResultTransformer(typeof(Foo)))
            .List<Foo>();

これにより、次の SQL が生成されます。

SELECT this_.* FROM Foo this_ inner join Bar b1_ on this_.BarId=b1_.Id
于 2010-08-26T02:41:33.320 に答える