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