우리는 엔티티의 계층 구조를 가지고 있습니다. 추상 바구니와 두 개의 콘크리트는 순서가 다른 동일한 항목 (예 : SaleBasketItem, ReturnBasketItem)의 목록을 포함 할 수 있습니다. 내가 basketType
동적으로 "판매"또는 "반환"중 하나입니다Hibernate는 HQL에서 잘못된 매개 변수 유형을 예상합니다.
"SELECT bi FROM " + basketType + "BasketItem bi JOIN bi.basket b JOIN b.saleSession JOIN bi.ware w WHERE b.state = :state"
같은 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>
그래서 문제가 발생합니다. 그리고 내가 필요 state
이
을 던져, (모든 추상 클래스에 존재하지 각각의 구상 클래스에서 다른) 콘크리트 바구니의 상태를 나타내는 몇 가지 열거입니다setParameter("state", state)
, 시도BasketItem
의 유형TypedQuery
에 해당 쿼리를 넣어 실제 반대로SaleBasket
상태 때나 타입ReturnBasketState
이다 : (... 파라미터 값과 일치하지 않은 타입 java.lang.IllegalArgumentException가)
는 IllegalArgumentException.
그래서 문제는 Hibernate가 해당 매개 변수에 대해 올바른 유형을 예상하도록 강제하는 방법입니다.
enum을 매개 변수로 전달합니까? 또는 그 enum 값의 문자열 표현? –
나는 열거 형을 매개 변수로 전달했습니다 – Krns