2016-10-27 8 views
0

私は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に登録しよ追加することによってそれを解決

+0

私が見ていることは、あなたがいつもそれを間違っていて、あなたの「回避策」は実際にはそうであったはずであるということです。少なくともクエリに応じて。どうやらバージョン5.2より前のHibernateはもっと寛容でした。 IDの直接クエリも機能するはずですが、エンティティクラスを参照することなく、IDプロパティを解決できないような何が間違っているかを示すことは不可能です。 – Gimby

+0

はい、私は間違っていましたが、あなたが言及したように、helper.idオプションもうまくいくはずですが、どうですか?あなたはエンティティの何を見る必要がありますか?私はそれらをここに置いても構いませんが、この問題をコードで過度に膨らませることなく、エンティティのどの部分を助け、どの部分を助けるかはわかりません。私はあなたが休止状態の設定(私はエンティティで休止状態の注釈を使用しないでください)からすべてのエンティティ情報を取得することができると思う – edbras

答えて

0

(それは5.2前に働いていたように):

SELECT member 
FROM  MemberDefault member 
JOIN  member.helpers helpers 
JOIN  helpers.helper hlp 
WHERE  hlp.id = :helperId 

注:これは私がネイティブSQLでそれを行うだろうかあると私はしかし前に、それを理解しますHibernate 5.2(おそらく既に以前の)、これは必要ではありませんでした!

関連する問題