Я не могу найти выход из этого.По сути, у меня есть что-то вроде:
@Embeddable
public class EmbeddedBase
{
...
}
@Embeddable
public class EmbeddedA extends EmbeddedBase
{
private String name;
getName()...
}
@Entity
public class MyEntity
{
private Map<String, EmbeddedBase> embeddeds = new ..;
getEmbeddeds()..
}
// Populate
MyEntity entity = new MyEntity();
entity.getEmbeddeds().put(EmbeddedA.class.getName(), new EmbeddedA());
...
// Try to query using join
From<MyEntity> from = criteria.from(MyEntity.class);
MapJoin<?,?,?> join = from.joinMap("embeddeds");
Path<?> pathToEmbeddedAName = join.value().get("name") <-- fails with attribute "name" not found
Это в некоторой степени имеет смысл, потому что базовый тип join.value () здесь - это «EmbeddedBase», а не «EmbeddedA».Тем не менее, я действительно знаю и могу убедиться, что базовый тип в моем случае - «EmbeddedA» (или любой другой потомок, но я точно знаю тип).Я делаю это потому, что добавляю отдельный предикат фильтра для проверки ключа карты, который содержит имя класса в виде строки, поэтому я выбираю правильную запись на карте.
Ведь янужно что-то вроде join.value (). castUnderylingJavaTypeTo (EmbeddedA.class)?Поскольку odb правильно сохраняет и извлекает поля, я просто не могу получить к нему доступ с использованием критериев api. Я также не могу использовать метамодель, потому что она недоступна для меня в этот момент ... так что я делаю неправильно?Кажется, я не могу найти простой выход отсюда?