私は以下のEJB構造を持っています。 Animal
とInventory
については不思議ではありませんが、これらのクラスは構造を簡略化して示しています(更新:わかりやすい例を作成するためにクラス名を改訂しました)。IdTag
の別の実装はBarcodeId
です。 IdTag
からAnimal
またはInventory
への逆の関係はなく、RfidTag.code
が一意であるとします。私はRetrieving Polymorphic Hibernate Objects Using a Criteria QueryとHibernate polymorphic queryを読むが、これらの議論は私の質問に答えていないようだ。逆の関係のない多型CriteriaQuery
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;
}
今、私はUnfortuately私は、次のerrrorを得る与え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;
}
ためAnimal
またはInventory
のいずれかを照会する:
javax.ejb.EJBException: java.lang.IllegalArgumentException:
Unable to resolve attribute [code] against path [null]
私はこれが関連していることを前提とし継承はIdTag
- >RfidTag
とAnimal
は約0123しか知りませんであり、RfidTag.code
ではありません。このようなクエリは可能ですか?
一般的な基準ビルダーを使用したことがないので、これが問題かどうかはわかりませんが、問題は継承ではなく、実行するパス.get( "code")メソッドはnullです。少なくともそれは例外の状態です。あなたはfrom.join( "idTag")がnullを返さないと確信していますか?テーブルの名前が大文字の "I"で定義されているので、from.join( "IdTag")に変更する必要はありません。 – peshkira
私が知る限り、 'from.join(" idTag ")'はテーブルの名前ではなく、 'ItemWithIdTag'の属性の名前を参照します。 – Thor
yepp - それは本当です...ごめんなさい。ただし、joinメソッドの戻り値をチェックしましたか。それはnullではありませんか?ネストされた例外が何であるかを見るためにスタックトレース全体を投稿できますか? – peshkira