Polymorphic CriteriaQuery без обратной связи

У меня есть следующая структура EJB. Не удивляйтесь Animal и Inventory [111] 40181], эти классы предназначены только для демонстрации структуры в упрощенном виде ( Обновление : я изменил имена классов, чтобы построить более понятный пример. Другой реализацией IdTag может быть BarcodeId ). Обратите внимание, что нет обратной зависимости от IdTag к Animal или Inventory , и давайте предположим, что RfidTag.code уникален. Я прочитал Получение полиморфных объектов гибернации с помощью критериев запроса и Полиморфный запрос гибернации , но эти обсуждения, похоже, не отвечают на мой вопрос.

public interface ItemWithIdTag
{
    IdTag getIdTag();
    void setIdTag(IdTag idTag);
}

@Entity public class Animal implements ItemWithIdTag,Serializable
{
    @Id @GeneratedValue(strategy=GenerationType.AUTO) private long id;

    @OneToOne(cascade = CascadeType.ALL)
    private IdTag idTag;
}

@Entity public class Inventory implements ItemWithIdTag,Serializable
{
    @Id @GeneratedValue(strategy=GenerationType.AUTO) private long id;

    @OneToOne(cascade = CascadeType.ALL)
    private IdTag idTag;
}

@Entity @Table(name = "IdTag") @Inheritance(strategy= InheritanceType.JOINED)
public class IdTag implements Serializable
{
    @Id @GeneratedValue(strategy=GenerationType.AUTO) private long id;
    private Date created;
}

@Entity @Table(name = "RfidTag")
public class RfidTag extends IdTag implements Serializable
{
    private String code;
}

Теперь я хочу запросить либо Животное или Инвентарь для данного RfidTag.code , например Animal ejb = bean.fEntityWithRfidTag (Animal.class, «myRfIdCode»);

public  T fOwner(Class type, String catName)
{
    CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
    CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(type);
    Root from = criteriaQuery.from(type);

    Path path = from.join("idTag").get("code");

    CriteriaQuery select = criteriaQuery.select(from);
    select.where(criteriaBuilder.equal(path, catName));

    TypedQuery q = em.createQuery(select); 
    T result = (T)q.getSingleResult();}
    return result;
}

К сожалению, получить следующая ошибка:

javax.ejb.EJBException: java.lang.IllegalArgumentException:
Unable to resolve attribute [code] against path [null]

Я предполагаю, что это связано с наследованием IdTag -> RfidTag и Animal знает только о IdTag и а не RfidTag.code . Возможны ли подобные запросы?

15
задан Community 23 May 2017 в 12:31
поделиться