2016-12-05 91 views
0

我有任務加載類別(按名稱加載)和子類別中的所有產品。在使用MySQL之後,我創建了SQL查詢:在Hibernate中的NamedQuery中使用用戶定義的變量

select * 
from product 
where primaryCategoryID in (
select categoryID 
from (select * from category) categories, 
     (select pv := (select categoryID from category where name = 'Tools') as ID) initialisation 
where find_in_set(parentCategory, pv) > 0 
and  pv := concat(pv, ',', categoryID) 
union 
select categoryID from category where name = 'Tools' 
) 

正如您可以在類別名稱中提到'Tools'一樣。它運作良好但是,如果您有任何建議 - 您是受歡迎的。 在我的項目中,我正在使用Hibernate命名查詢。問題是變量@pv。現在它沒有編譯並拋出異常爲'意外的令牌...' 有誰知道如何在NamedQuery中使用變量?

回答

0

Hibernate不支持許多SQL功能。例如。您在查詢中使用union,這不受支持。與變量相同。

嘗試使用命名原生查詢(見example

對於註釋也可能是這樣的(從上面的例子)

@NamedNativeQueries({ 
    @NamedNativeQuery(
    name = "findStockByStockCodeNativeSQL", 
    query = "select * from stock s where s.stock_code = :stockCode", 
     resultClass = Stock.class 
    ) 
}) 
@Entity 
@Table(name = "stock", catalog = "mkyong") 
public class Stock implements java.io.Serializable { 

,並把您的查詢的註解

+0

謝謝,這是有用的評論。問題是如何通過Hivernate(Named-Query)將所有產品加載到類別及其子類別中。 – user3650408

+0

發佈您的實體和當前的代碼。簡而言之,您需要加載類別列表(按名稱初始列表),加入子類別(不知道您在實體中的父 - 子映射),並加入產品(再次不知道您的實體提供正確的映射) 。深度= 1是很好的。如果你需要所有類別的子樹,恐怕hibernate不會提供這樣做的方法。所以你可以使用本地查詢並將它們映射到期望的實體。 – StanislavL

+0

非常感謝。對於1深度它的作品。所以,當深度超過1(原始問題)時,問題是開放的。如果Hibernate不支持這個查詢,你對過程/函數有什麼看法? Hibernate是否可以通過調用過程/函數加載數據? – user3650408

相關問題