我们有一个实体的层次结构,例如抽象篮子和两个具体的实体,它们又可以包含一些其他项目的列表,例如,具有完全相同的层次结构(SaleBasketItem,ReturnBasketItem)。
@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"
wherebasketType
是动态的“销售”或“退货”。然后我用我需要TypedQuery
的类型输入该查询BasketItem
并尝试setParameter("state", state)
,其中state
一些枚举表示具体篮子的状态(在每个具体类中不同,根本不存在于抽象类中),这会抛出
IllegalArgumentException(java.lang.IllegalArgumentException:参数值 ... 与类型不匹配)
其中 type 是ReturnBasketState
实际是SaleBasket
状态时,反之亦然。
所以问题是 - 如何强制 Hibernate 期望该参数的正确类型?