繁体   English   中英

休眠标准离开了我们

[英]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

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

  1. 对条件查询使用SQL查询或SQL限制
  2. 将“收藏夹”和“机器”之间的关系映射为Any类型关联

由于您已经有了查询,因此通过hibernate作为本地SQL查询执行查询是最简单的解决方案:

sess
  .createSQLQuery("SELECT ... ")
  .addEntity(Machine.class)
  .list();

但是,在要查询收藏夹的其他情况下,“任何类型”关联可能会使您受益。

如@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM