8

ネイティブSQLクエリを使用しており、プレーヤーテーブルに3回参加します。最初に打者の名前を取得し、次にボウラーの名前を取得し、次に野手の名前を取得します。これで最初の結合が機能しますが、次の2つも同じ名前、つまり打者の名前を返します。

これがSQLクエリです

 select 
    del.over_no , 
    del.delivery_no , 
    batsman.sname , 
    outType.name , 
    outBy.sname , 
    fielder.sname , 
    bep.runs, 
    bep.deliveries, 
    bep.fours, 
    bep.sixes

    from delivery del 
    INNER JOIN batsman_performance bep ON del.innings_id=bep.innings_id 
    INNER JOIN ref_player batsman ON del.batsman_id = batsman.id
    INNER JOIN ref_player outBy ON del.bowler_id = outBy.id
    LEFT OUTER JOIN ref_player fielder ON del.fielder_id1= fielder.id
    INNER JOIN ref_out_type outType ON del.out_type_id=outType.id
    and del.out_type_id IS NOT NULL 
    and del.innings_id=:innings_id 
    and bep.player_id = del.batsman_id
    order by over_no, delivery_no;

選択した列にエイリアスを使用していません。使用したときに、エイリアスを使用する列に対して休止状態が例外をスローしたためです。

リクエストの処理に失敗しました。ネストされた例外はjavax.persistence.PersistenceException:org.hibernate.exception.SQLGrammarException:クエリを実行できませんでした]ルート原因java.sql.SQLException:列'over_no'が見つかりません。

このクエリは、mysqlクライアントで実行すると機能し、正しいデータセットを返しますが、コードで実行すると、結果セットはref_playerテーブルの後続の2つの結合を何らかの形でオーバーライドし、3つの列すべてにbatsman名が残ります。つまり、batsman.sname、outBy.sname、fielder.snameの各列に同じ名前があります。

私はここ2日間ここで立ち往生しています、どんな助けでも素晴らしいでしょう。

4

4 に答える 4

5

selectを別のselectステートメントでラップしてみてください。うまくいくはずです。ストアドプロシージャを使用していますが、違いはありません

SELECT * FROM (

SELECT 
    del.over_no , 
    del.delivery_no , 
    batsman.sname , 
    outType.name , 
    outBy.sname , 
    fielder.sname , 
    bep.runs, 
    bep.deliveries, 
    bep.fours, 
    bep.sixes

    from delivery del 
    INNER JOIN batsman_performance bep ON del.innings_id=bep.innings_id 
    INNER JOIN ref_player batsman ON del.batsman_id = batsman.id
    INNER JOIN ref_player outBy ON del.bowler_id = outBy.id
    LEFT OUTER JOIN ref_player fielder ON del.fielder_id1= fielder.id
    INNER JOIN ref_out_type outType ON del.out_type_id=outType.id
    and del.out_type_id IS NOT NULL 
    and del.innings_id=:innings_id 
    and bep.player_id = del.batsman_id
    order by over_no, delivery_no
) AS subselection;

上記では、実際にはエイリアスを使用する必要があります。そうしないと、同じ名前の2つの列が作成され、エラーがスローされます。

于 2012-09-11T18:54:11.157 に答える
2

Hibernateのバグ追跡に関する保留中の問題です。

このチケットを見る

休止状態のフォーラムでも。これは、これが休止状態の終わりのバグであることを明確に示しています。

Hibernateフォーラムディスカッションを参照してください

于 2012-09-10T09:56:17.123 に答える
0

変えてみましたか

 order by over_no, delivery_no; 

 order by del.over_no, del.delivery_no;
于 2012-08-15T11:10:38.247 に答える
0

同じ問題を発見しました。別の回避策はorg.hibernate.Session#doWork、JDBC接続でクエリを使用して実行することです。

entityManager.unwrap(Session.class).doWork(new Work() {
  void execute(Connection c) throws SQLException {
   PreparedStatement stmt = c.prepareStatement("SELECT ... JOIN ... JOIN ...");
   try {
     ...
   } finally {
     stmt.close() 
   }
于 2013-06-12T09:16:08.607 に答える