web-dev-qa-db-ja.com

トラバースするノードはnullにできません(Hibernate SQL)

私は休止状態を介して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の行をスキップできますか?

24
tiswas

createNamedQueryの代わりにcreateQueryを宣言していたため、このエラーが発生しました。したがって、これを検出すると、休止状態は例外をスローします

    Query query = entityManager.createQuery("DS.findUser");
38
MariemJab

横断するノードは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
32
Evan Oxfeld

私は以前にもこの問題に何度か遭遇しましたが、コードがcreateQueryの代わりにcreateNamedQueryを呼び出すことで名前付きクエリを実行しようとしていたことが常にありました。 _"FIND_XXX"_という名前の名前付きクエリがある場合、コードはentityManager.createQuery(FIND_XXX)を呼び出して、名前付きクエリの名前を表す文字列を標準の動的クエリ文字列であるかのように実行しようとします(これは明らかに問題です)。

19
brent777

更新ステートメントのコンマを忘れるなど、構文エラーのあるクエリを実行した場合にも、このエラーが発生する可能性があります。

update MyObject set field1=5 field2=4 WHERE id = 4

Field1 = 5とfield2 = 4の間にコンマがないことがわかりますか?横断するノードをnullエラーにすることはできません。

3
Gandalf

このエラーは通常、想像もしなかった最も愚かな理由の1つが原因で発生します。クエリをコピーして貼り付けると、いくつかの特殊文字が導入され、このエラーが発生し始めます。クエリを手動で入力すると、正常に機能することを確認してください。私の場合、少なくともうまくいきました。

3
user1842915

Hibernate 4を使用している場合、以下を呼び出す必要があります。

Query query = session.getNamedQuery(Entity.NAMED_QUERY);

の代わりに

Query query = session.createQuery(Entity.NAMED_QUERY);

これは、session.createQueryEntity.NAMED_QUERYの文字列値に基づいてクエリを作成しようとするために発生します。例:

String NAMED_QUERY = "Entity.namedQuery";

誤ったHQLが発生し、例外が発生します。

0
Samuel Torga