次の EJB 構造があります。Animal
とについては不思議に思わないでくださいInventory
。これらのクラスは、単純化された方法で構造を示すためにここにあるだけです (更新:よりわかりやすい例を作成するためにクラス名を変更しました。 の別の実装はIdTag
かもしれませんBarcodeId
)。IdTag
からAnimal
またはに逆の関係がないことに注意してください。 は一意でInventory
あると仮定しましょう。基準クエリを使用したポリモーフィック Hibernate オブジェクトの取得とHibernate ポリモーフィック クエリ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;
}
今、私はどちらAnimal
かInventory
をクエリしRfidTag.code
たいAnimal ejb = bean.fEntityWithRfidTag(Animal.class,"myRfIdCode");
public <T extends ItemWithIdTag> T fOwner(Class<T> type, String catName)
{
CriteriaBuilder criteriaBuilder = em.getCriteriaBuilder();
CriteriaQuery<T> criteriaQuery = criteriaBuilder.createQuery(type);
Root<T> from = criteriaQuery.from(type);
Path<Object> path = from.join("idTag").get("code");
CriteriaQuery<T> select = criteriaQuery.select(from);
select.where(criteriaBuilder.equal(path, catName));
TypedQuery<T> 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
. このようなクエリは可能ですか?