タイトル: net.sf.hibernate.QueryException: unexpected token: as [~]
SEOタイトル: Hibernate QueryException: unexpected token: as の対処
エラー内容
| net.sf.hibernate.QueryException: unexpected token: as [~] |
発生条件
- Hibernate (HQL) のクエリ実行時に発生
- パッケージ名が
net.sf.hibernateとなっているのは Hibernate 2.x 系のもの (現在の Hibernate はorg.hibernate) - 同様のメッセージは新しい Hibernate でも「
org.hibernate.hql.internal.ast.QuerySyntaxException: unexpected token: as」として出ます
原因
HQL (Hibernate Query Language) の構文エラーです。SQL とよく似ていますが、テーブル名ではなくエンティティクラス名を扱う点や、エイリアスの位置・順序にいくつかの違いがあり、SQL のつもりで書くと as の位置でこのエラーを引き起こすことが多いです。
HQL でよくある「unexpected token: as」の原因
| パターン | NG例 | 正しい書き方 |
|---|---|---|
| FROM 句のテーブル指定にDBの実テーブル名を書いた | FROM USER_TABLE as u | FROM User as u (Userはエンティティクラス名) |
| SELECTの列に as 別名を付けた | SELECT u.name as userName FROM User u (HQL2系で非対応) | 結果はそのまま受ける/コンストラクタクエリを使う |
| JOIN の構文ミス | FROM User u JOIN ON u.id = ... | FROM User u INNER JOIN u.orders o |
| asのスペル違い・全角文字 | FROM User as u (全角スペース) | 半角空白に修正 |
| サブクエリの位置 | SQLでは可能だがHQLで非対応な位置 | HQLで許容される位置に移すか JPQL/Native Query へ |
| 未マッピングのプロパティ参照 | SELECT u.unknownField FROM User u | エンティティに定義のあるフィールドのみ参照 |
対処手順
1. エラーメッセージの [~] 部分を確認
角括弧内には解析対象の HQL 全体が出ます。まずそこを目視で確認し、テーブル名 / FROM / JOIN / SELECT などの構文が HQL として正しいかを確認します。
2. SQL ではなく HQL であることを意識する
- FROM 句に書くのはエンティティクラス名 (Java 側のクラス名・大文字小文字も区別)
- SELECT はプロパティ名 (テーブル列名ではない)
- JOIN は関連プロパティで記述 (
JOIN u.orders)
3. 簡単なクエリから組み立てて切り分け
|
// まずは最小から |
4. それでも難しければ JPQL / Criteria / NativeQuery を検討
- JPQL (JPA 標準) は HQL とほぼ同じ。Hibernate 5+ ならまずこちらを推奨
- Criteria API: 文字列で書かずに型安全に構築できるためタイプミスが起きにくい
- どうしても DB ネイティブ SQL を投げたいときは
createNativeQuery(sql)を使う
5. 古いHibernate 2系の場合
- パッケージ
net.sf.hibernateはHibernate 2.x。すでに長期間メンテされていません - 新規開発であれば
org.hibernate系の最新版 (Hibernate 6 系) へ移行を強く推奨 - Hibernate 2 専用に書かれた HQL は、現代の Hibernate で動かないケースもあるため、移行時はクエリ単位での見直しが必要
関連エラー
QuerySyntaxException: User is not mapped— エンティティが Hibernate 設定に登録されていないunexpected token: . near line ...— プロパティ参照や JOIN パス指定の誤りcould not resolve property— エンティティに該当プロパティが無い
関連
- 親カテゴリ: エラー一覧 (Hibernate)
- 関連: Hibernate