2013-03-21 3 views
1

У нас есть иерархия объектов, например. абстрактная корзина и два бетона, которые, в свою очередь, могут содержать список некоторых других предметов, например, с одинаковой иерархией (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> 

Таким образом, проблема возникает при попытке выполнить запрос HQL как

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

где basketType является динамически либо "Продажа" или "Return". Тогда я поставил этот запрос в TypedQuery с типом BasketItem мне нужно, и попытаться setParameter("state", state), где state является некоторое перечисление, представляющее состояние конкретной корзины (по-разному в каждом конкретном классе, нет в абстрактном классе на всех), который бросает

IllegalArgumentException (java.lang.IllegalArgumentException: значение параметра ... не соответствующий тип)

где тип ReturnBasketState когда актуальным является SaleBasket состояние, или наоборот.

Итак, вопрос в том, как заставить Hibernate ожидать правильный тип для этого параметра?

+0

Вы передаете enum в качестве параметра? Или строковое представление этого значения перечисления? –

+0

Я передал Enum как param – Krns

ответ

-1

Я полагаю, что он ожидает параметр String как параметр, а не Enum. попробуйте передать строку.

+0

Нет, он ожидает другого перечисления. Он пытается вывести тип bi.basket, но в этом не получается. – Krns