Hibernate标准离开了我们的联盟

时间:2014-10-10 02:37:32

标签: java sql hibernate hibernate-criteria

我有以下实体:

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

2 个答案:

答案 0 :(得分:0)

有两种方法可以做到这一点:

  1. 使用SQL查询或SQL restriction进行条件查询。
  2. 将收藏夹和计算机之间的关系映射为Any type association
  3. 由于您已经有了查询,因此通过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的含义是什么?我保留它,因为它在我的答案中但是,我不明白是什么目的 @