-2

SQLServer2005で次のクエリがあります。

SELECT distinct(user.id_user), user.name, user.familyname from tbl_users users 
inner join tbl_notes notes on users.id_user = notes.id_user 
where notes.id_book = 1

必要なすべてのクラスがマップされており、HibernateAPIを使用して作成する必要があります。これまでに次のコードを記述しましたが、nullを返します。

hibernateSession = HibernateUtil.getSessionFactory().openSession();
criteria = hibernateSession.createCriteria(TblUsers.class, "users")
        .createCriteria("users.id_user", "tblNotes")
        .add(Restrictions.eq("tblNotes.idBook", idBook));

criteria.setProjection(Projections.projectionList()
                .add(Projections.distinct(Projections.property("users.idUser")))
                .add(Projections.property("users.name"))
                .add(Projections.property("users.familyName")));

ret = criteria.list(); 
4

1 に答える 1

1
Criteria c = session.createCriteria(User.class);
Criteria nc = c.createCriteria("notes", "note");
nc.add("bookId", 1);

ProjectionList pl = Projections.projectionList();
pl.add(Projections.distinct(Projections.property("userId")));
pl.add(Projections.property("name"));
pl.add(Projections.property("familyName"));
c.setProjection(pl);

List<Object[]> result = (List<Object[]>) c.list();

またはこの性質の何か。2番目の「createCriteria」は、定義された関係を使用して、notesテーブルとの結合を強制します。ノートテーブルは(user_id列を介して)ユーザーと関係があるように見えるので、休止状態がユーザーからノートに移動する方法を理解できるようにマップしたと仮定します。さらに、結果のCriteriaオブジェクトを使用すると、結合されるノートに条件を設定できます。

最後に、ProjectionListを作成して、必要なプロジェクションを列挙します。この場合、1つの別個の列と他の2つの列が必要です。

返されるのはObject[]のリストです。

私はこのコードをテストしていません。クラスを投稿していないので、このような結合を実行できるようにすべてがマップされているかどうかは100%わかりません。

于 2012-07-19T12:46:57.067 に答える