[英]Hibernate criteria left our join
我有以下实体:
Machines {
id,
name
}
Favorites {
userId,
objectId,
objectType
}
现在,我想返回按收藏夹排序的机器列表,名称。
收藏夹与Machines实体没有任何关系,它是可以容纳各种收藏对象的通用实体。
我通过以下原始sql进行排序。 有没有什么办法可以使用休眠标准来使其正常工作。 基本上可以为“收藏夹”添加别名,尽管“机器”没有任何引用。
select m.* from Machines m left outer join Favorites f on m.id=f.objectId and f.userId =@userId order by f.userId desc, m.name asc
如@Maarten Winkels所说,您可以使用已有的本机SQL查询。 您可以这样做,但是,如果要更改数据库,则语法可能会有所不同。 因此, 建议不要使用本机SQL查询。
没有表之间的任何关联,就不能使用Hibernate条件执行外部联接。 如果您改变主意并想在这些表之间添加关联,则可以使用条件执行以下类似操作
List machines = session.createCriteria( Machines.class )
.createAlias("Machines", "m")
.createAlias("Favorites", "f", Criteria.LEFT_JOIN,
Restrictions.and(Restrictions.eq("m.id", "f.objectId"),
Restrictions.eq("f.userId", "@userId")))
.addOrder(Order.desc("f.userId"))
.addOrder(Order.asc("m.name"))
.list();
如果由于某种原因您不想在这些表之间添加任何关系 ,则可以使用INNER JOIN或CROSS JOIN来获取所有具有所需条件的计算机。
from Machines m, Favorites f where m.id = f.objectId and f.userId = @userId order by f.userId desc, m.name asc;
对于内部联接,存在一个问题,如果数据库中存在外部联接关系,则它不起作用。
您还可以编写子查询或单独的查询,并在这些查询返回的结果之间执行手动条件检查。
我想问你一件事,@ userId在您的SQL查询中是什么意思? 我将其保留为我的答案,但是,我不知道@有什么用途?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.