私は休止状態を介してSQLクエリを実行しています。
SELECT thi
FROM track_history_items thi
JOIN artists art
ON thi.artist_id = art.id
WHERE thi.type = "TrackBroadcast"
GROUP BY art.name
ORDER thi.createdAt DESC
しかし、「横断するノードをnullにすることはできません!」というメッセージが表示されます。誰がこれを引き起こしているのか知っていますか?
--[〜#〜] edit [〜#〜]-
この問題は、artist_idがヌルになる可能性が原因であると確信しています。ただし、これを防ぐことはできないので、artist_idがnullの行track_history_itemの行をスキップできますか?
createNamedQueryの代わりにcreateQueryを宣言していたため、このエラーが発生しました。したがって、これを検出すると、休止状態は例外をスローします
Query query = entityManager.createQuery("DS.findUser");
横断するノードはnullにできません!
これは、クエリの構文の問題を示す一般的なHibernateエラーメッセージです。別の例として、「SELECT」という単語で選択句を開始するのを忘れると、同じエラーが発生します。
この場合、構文エラーはon句が原因です-HQLはそれらをサポートしていません。代わりに、次のようなクロスジョインを実行します。
FROM track_history_items thi, artists art
WHERE thi.type = "TrackBroadcast"
AND thi.artist_id = art.id
GROUP BY art.name
ORDER thi.createdAt DESC
私は以前にもこの問題に何度か遭遇しましたが、コードがcreateQuery
の代わりにcreateNamedQuery
を呼び出すことで名前付きクエリを実行しようとしていたことが常にありました。 _"FIND_XXX"
_という名前の名前付きクエリがある場合、コードはentityManager.createQuery(FIND_XXX)
を呼び出して、名前付きクエリの名前を表す文字列を標準の動的クエリ文字列であるかのように実行しようとします(これは明らかに問題です)。
更新ステートメントのコンマを忘れるなど、構文エラーのあるクエリを実行した場合にも、このエラーが発生する可能性があります。
update MyObject set field1=5 field2=4 WHERE id = 4
Field1 = 5とfield2 = 4の間にコンマがないことがわかりますか?横断するノードをnullエラーにすることはできません。
このエラーは通常、想像もしなかった最も愚かな理由の1つが原因で発生します。クエリをコピーして貼り付けると、いくつかの特殊文字が導入され、このエラーが発生し始めます。クエリを手動で入力すると、正常に機能することを確認してください。私の場合、少なくともうまくいきました。
Hibernate 4を使用している場合、以下を呼び出す必要があります。
Query query = session.getNamedQuery(Entity.NAMED_QUERY);
の代わりに
Query query = session.createQuery(Entity.NAMED_QUERY);
これは、session.createQuery
がEntity.NAMED_QUERY
の文字列値に基づいてクエリを作成しようとするために発生します。例:
String NAMED_QUERY = "Entity.namedQuery";
誤ったHQLが発生し、例外が発生します。