私はHibernateを5.1から5.2.xにアップグレードして以来、次の名前付きクエリはもはや動作しません。何か助けてください? 1)メンバー 2)ヘルパー:Hibernate HQLバージョン5.2以降、多対多に参加することはもうできませんか?
FROM MemberDefault member
JOIN member.helpers hlp
WHERE hlp.helper = :helperId
それは2つのテーブルに関係多対多の助けされているヘルパーやメンバーに関するメンバー表には2つの外部キー関係を有しています。
休止状態の設定の抜粋:
<composite-element class="HelperDefault">
<parent name="helperClient" />
<many-to-one name="helper" column="idHlpMember" class="MemberDefault" not-null="true" cascade="none"/>
</composite-element>
</set>
休止5.2でもうない作品コード:
Query<Member> query = getPersister().getNamedQuery(Member.class, getQueries().findMembersByTheirHelper());
List<Member> members = query.setParameter("helperId", helperId).getResultList();
例外:
org.hibernate.HibernateException: Unable to resolve entity name from Class [java.lang.String] expected instance/subclass of [MemberDefault]
私が最後に変更名前付きクエリの行: WHERE hlp.helper.id =:helperId
私はこれが最初の位置にあるべきであり、私は間違っていたことを認識しています。 そして、私は例外を取得行います
org.hibernate.QueryException: could not resolve property: helper.id of: MemberDefault
は、なぜそれが財産「helper.id」としませHelperDefaultインスタンスをルックアップするためにMemberDefaultインスタンスを使用していますか?これはバグですか?私が見つけた
回避策:、
WHERE hlp.helper = :helperId
、代わりにIDのパラメータhelperId(文字列)などのオブジェクトのMemberDefaultを指定: は、私のような最後の行に元に戻って名前付きクエリを変更しましたコードは次のようになります。
Member helper = findMemberById(helperId);
Query<Member> query = getPersister().getNamedQuery(Member.class, getQueries().findTaxersByTheirHelper());
List<Member> members = query.setParameter(getQueryParams().helperId(), helper).getResultList();
helperIdを文字列として使用するにはどうすればよいでしょうか?余分なHSQLに登録しよ追加することによってそれを解決
私が見ていることは、あなたがいつもそれを間違っていて、あなたの「回避策」は実際にはそうであったはずであるということです。少なくともクエリに応じて。どうやらバージョン5.2より前のHibernateはもっと寛容でした。 IDの直接クエリも機能するはずですが、エンティティクラスを参照することなく、IDプロパティを解決できないような何が間違っているかを示すことは不可能です。 – Gimby
はい、私は間違っていましたが、あなたが言及したように、helper.idオプションもうまくいくはずですが、どうですか?あなたはエンティティの何を見る必要がありますか?私はそれらをここに置いても構いませんが、この問題をコードで過度に膨らませることなく、エンティティのどの部分を助け、どの部分を助けるかはわかりません。私はあなたが休止状態の設定(私はエンティティで休止状態の注釈を使用しないでください)からすべてのエンティティ情報を取得することができると思う – edbras