如何在Hibernate中编写此查询?

时间:2012-07-19 12:06:40

标签: java hibernate distinct

我在SQL Server 2005中有以下查询:

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

我已经映射了所有必需的类,我需要使用hibernate API编写它。 到目前为止,我已经编写了以下代码,但它返回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(); 

1 个答案:

答案 0 :(得分: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();

或者这种性质的东西。第二个“createCriteria”使用您定义的关系强制连接notes表。由于看起来你的笔记表与User有关系(通过user_id列),我假设你已经映射了它,以便hibernate可以弄清楚如何从User到Note。此外,生成的Criteria对象允许您为要连接的音符设置条件。

最后,我们只需创建一个ProjectionList来枚举我们想要的投影。在这种情况下,我们需要1个不同的列以及2个其他列。

您将获得的是Object []列表。

我没有测试过这段代码,因为你没有发布你的课程,我不是百分之百确定所有内容都是以这样的方式映射的,你可以像这样进行连接。