簡體   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