Я пытался использовать полиморфный запрос с JPA (hibernate как поставщик) в следующем доменном сценарии:
PriceTable (1) <---> (n) ItemPrice (n) <----> (1) Item
Таким образом, для каждого PriceTable, зарегистрированного в моей системе, у меня есть набор цен на товары, которые описывают цену данного товара в этой таблице. Элементом может быть Оборудование или Структура, и я намерен увеличить иерархию.
Объявления класса следующие (плз, что идентификаторы работают):
@Entity
class PriceTable {
private Set<ItemPrice> priceList = new HashSet<ItemPrice>();
//getters & setters;
}
@Entity
class ItemPrice {
private Item item;
@Any(metaColumn = @Column(name = "itemtype"), fetch = FetchType.LAZY)
@AnyMetaDef(idType = "long",
metaType = "string",
metaValues = {
@MetaValue(value = "Equipment", targetEntity = Equipment.class),
@MetaValue(value = "Structure", targetEntity = Structure.class)
})
@JoinColumn(name="itemid")
public Item getItem(){
return item;
}
}
@MappedSuperClass
class Item {
//...
}
@Entity
class Equipment extends Item {
//...
}
@Entity
class Structure extends Item {
//...
}
Когда я пытаюсь запросить все PriceTables, которые содержат данный Item в его priceList, используя Query.setParameter для типа интересующего меня Предмета, он всегда связывает параметр как нулевой. Посмотрите на код запроса:
String query = "from PriceTable pt "+
" where ? in " +
" (select ptpricelist.item.id from pt.priceList ptpricelist " +
" where ptpricelist.item.class = ?) ";
Query q = entityManager.createQuery(query);
q.setParameter(1, myItem.getId());
q.setParameter(2, "'Equipment'");
След Hibernate дает мне это:
2010-02-22 17:55:32,683 DEBUG [org.hibernate.type.NullableType:126] - binding null to parameter: 2
И, конечно, не имеет никакой ценности. Странно, если я вручную установлю параметр matevalued, например:
String query = "from PriceTable pt "+
" where ? in " +
" (select ptpricelist.item.id from pt.priceList ptpricelist " +
" where ptpricelist.item.class = 'Equipment') ";
Query q = entityManager.createQuery(query);
q.setParameter(1, myItem.getId());
Работает отлично. Поэтому я думаю, что hibernate / JPA не разрешает параметр запроса как мета-значение, как следует (посмотрите документацию hibernate об этом ). Вероятно, это было решено как строка. Ребята, у вас есть какие-нибудь обходные пути? Я действительно не хочу использовать переключатели в моем коде только для преодоления этого странного поведения setParameter.
Большое спасибо!