1

エンティティの階層があります。たとえば、抽象的なバスケットと 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のタイプで入力します。具体的なバスケットの状態を表す列挙型 (具体的なクラスごとに異なり、抽象クラスにはまったく存在しません) をスローします。BasketItemsetParameter("state", state)state

IllegalArgumentException(java.lang.IllegalArgumentException: パラメータ値 ... 型が一致しませんでした)

ReturnBasketStateここで、actual が state の場合は type SaleBasket、またはその逆です。

問題は、Hibernate にそのパラメーターの正しい型を期待させる方法です。

4

1 に答える 1

-1

列挙型ではなく、文字列をパラメーターとして期待していると思います。代わりに文字列を渡してみてください。

于 2013-03-22T14:05:30.063 に答える