Как Jpa Query.setParameter работает с MetaValue (полиморфный запрос)? - PullRequest
1 голос
/ 23 февраля 2010

Я пытался использовать полиморфный запрос с 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.

Большое спасибо!

1 Ответ

2 голосов
/ 23 февраля 2010

Попробуйте отбросить одинарные кавычки из литерала:

q.setParameter(2, "Equipment");

вместо

q.setParameter(2, "'Equipment'"); 

Если это не сработает, попробуйте использовать полное имя класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...