我有Hibernate HQL查询,它似乎可以很好地完成它的工作,但我目前正在尝试使用Hibernate Criteria API,并希望用Criteria API来表达相同的HQL查询。在这个特定的示例中,我在HQL查询中有两个连接,其中我的第二个连接使用了第一个连接的别名。我想用Criteria API来实现一些相同的东西。这个是可能的吗?
以下是原始查询:
select mt
from MessageThread mt
inner join mt.messageThreadsStatuses ts
inner join ts.threadLocations tl
where ts.user.userId = :userId and tl = 0";
以下是重写的查询,它不适用于我:
Criteria c = sf.getCurrentSession().createCriteria(MessageThread.class)
.createAlias("messageThreadsStatuses", "ts").setFetchMode("ts", FetchMode.JOIN)
.createAlias("ts.threadLocations", "tl").setFetchMode("tl", FetchMode.JOIN)
.add(Restrictions.eq("ts.user.userId", userId))
.add(Restrictions.eq("tl", 0));
例如,我还尝试将第二个别名定义为:
.createAlias("threadLocations", "tl").setFetchMode("tl", FetchMode.JOIN)
但没有成功。
发布于 2012-08-24 16:17:29
如以下文档http://billingb.livejournal.com/34266.html所示
如果您使用别名和您创建的每个criteria对象,则解决这两个问题很容易。我认为最大的错误是,大多数示例都将所有标准的创建链接在一起,但您可以将它们分开,一切都变得更容易理解。我想出的解决方案代码如下所示:
Criteria c = session.createCriteria(Parameter.class);
Criteria cx = c.createCriteria("masterCollections");
cx.createAlias("datasetEntry", "de");
cx.createAlias("parameters", "par");
c.add(Restrictions.or(Restrictions.in("de.datasetId",datasetIDList), Restrictions.in("par.parameterId", parameterIDList)));
https://stackoverflow.com/questions/12104825
复制相似问题