2012-07-19 141 views
-2

我在SQL Server 2005中以下查询:我如何在Hibernate中编写这个查询?

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

我用内部联接,没有为我工作,然后我用其他查询,而不是工作。就以这个帖子一看:http://stackoverflow.com/questions/11441313/sql-query-with-mysql – Ali 2012-07-19 12:27:38

+0

我只创建了鲜明的条款查询现在,我在网上看一些例子来添加连接子句。我是休眠的新手。 – PauloBueno 2012-07-19 12:31:02

回答

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_id列)有关系,因此我假设您已将其映射,以便休眠可以找出如何从用户到笔记。另外,生成的Criteria对象允许您在要加入的笔记上设置条件。

最后,我们简单地创建一个ProjectionList枚举我们想要的预测。在这种情况下,我们需要1个不同的列以及2个其他列。

什么,你会得到的回复是在Object []列表。

我没有测试此代码,因为你没有发表您的课,我不是100%肯定,一切都以这样的方式,你可以做这样的映射加入。