我有以下实体:
Machines {
id,
name
}
Favorites {
userId,
objectId,
objectType
}
现在我想返回按收藏夹命名的机器列表名称。
收藏夹与机器实体没有任何关系,机器实体是一个可以容纳各种有利可图对象的通用实体。
我通过以下原始sql进行排序。有没有办法让这个工作使用hibernate标准。基本上能够为收藏夹添加别名虽然机器没有任何引用它。
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
答案 0 :(得分:0)
有两种方法可以做到这一点:
由于您已经有了查询,因此通过hibernate将其作为本机SQL查询执行是最简单的解决方案:
sess
.createSQLQuery("SELECT ... ")
.addEntity(Machine.class)
.list();
但是,在您想要查询优先级的其他情况下,Any类型关联可能会让您受益。
答案 1 :(得分:0)
正如@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;
使用内部联接有一个问题,如果数据库中存在外部联接关系,那么它就不起作用。
您还可以撰写子查询或单独查询&在这些查询返回的结果之间执行手动条件检查。
我想问你一件事,你的SQL查询中@userId的含义是什么?我保留它,因为它在我的答案中但是,我不明白是什么目的 @ ?