エンティティの階層があります。たとえば、抽象的なバスケットと 2 つの具体的なバスケットです。これには、まったく同じ階層 (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"
ここbasketType
で、動的に「販売」または「返品」のいずれかになります。次に、そのクエリをI need and try toTypedQuery
のタイプで入力します。具体的なバスケットの状態を表す列挙型 (具体的なクラスごとに異なり、抽象クラスにはまったく存在しません) をスローします。BasketItem
setParameter("state", state)
state
IllegalArgumentException(java.lang.IllegalArgumentException: パラメータ値 ... 型が一致しませんでした)
ReturnBasketState
ここで、actual が state の場合は type SaleBasket
、またはその逆です。
問題は、Hibernate にそのパラメーターの正しい型を期待させる方法です。