2013-03-21 23 views
1

我們有一個實體層次結構,例如,抽象Basket和兩個具體,它們又可以包含一些其他項目的列表,例如具有完全相同的層次結構(SaleBasketItem,ReturnBasketItem)。Hibernate期待HQL中的參數類型錯誤

@Entity 
@XStreamAlias("basket") 
@DiscriminatorColumn(name = "basket_type") 
@DiscriminatorOptions(force = true) 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public abstract class Basket<T extends BasketItem> 

@Entity 
@DiscriminatorValue(value = "SALE") 
public class SaleBasket extends Basket<SaleBasketItem> 

@Entity 
@DiscriminatorValue(value = "RETURN") 
public class ReturnBasket extends Basket<ReturnBasketItem> 

@Entity 
@Table(name = "basket_item") 
@XStreamAlias("basket_str") 
@DiscriminatorColumn(name = "basket_item_type") 
@DiscriminatorOptions(force = true) 
@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 
public abstract class BasketItem<U extends BasketItem, V extends Basket> 

@Entity 
@DiscriminatorValue(value = "RETURN") 
public class ReturnBasketItem extends BasketItem<ReturnBasketItem, ReturnBasket> 


@Entity 
@DiscriminatorValue(value = "SALE") 
public class SaleBasketItem extends BasketItem<SaleBasketItem, SaleBasket> 

所以,當我嘗試執行像

"SELECT bi FROM " + basketType + "BasketItem bi JOIN bi.basket b JOIN b.saleSession JOIN bi.ware w WHERE b.state = :state" 

其中basketType動態要麼是「出售」或「返回」 HQL查詢問題就出現了。然後,我把該查詢在TypedQuery型的BasketItem我需要和嘗試setParameter("state", state),其中state是一些枚舉代表的混凝土籃的狀態(在每個具體的類不同的,而不是抽象的類都存在),這將引發

拋出:IllegalArgumentException(java.lang.IllegalArgumentException異常:參數值...不匹配型)

其中類型是ReturnBasketState當實際是SaleBasket狀態,或者反之亦然。

所以問題是 - 如何強制Hibernate期望該參數的類型正確?

+0

您是否將enum作爲參數傳遞?或者該枚舉值的字符串表示? – 2013-03-21 13:25:06

+0

我通過枚舉作爲參數 – Krns 2013-03-22 12:08:37

回答

-1

我想它期望一個字符串作爲參數,而不是一個枚舉。嘗試傳遞一個字符串。

+0

不,它期待其他枚舉。它試圖推斷bi.basket的類型,但是失敗了。 – Krns 2013-03-22 14:13:56