この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:2
ページ更新者:atom
更新日時:2026-05-17 06:14:09

タイトル: 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 uFROM 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. 簡単なクエリから組み立てて切り分け

// まずは最小から
FROM User

// 別名を加える
FROM User u

// 条件を加える
FROM User u WHERE u.active = true

// JOIN を加える
FROM User u JOIN u.orders o WHERE o.total > 1000

4. それでも難しければ JPQL / Criteria / NativeQuery を検討

  • JPQL (JPA 標準) は HQL とほぼ同じ。Hibernate 5+ ならまずこちらを推奨
  • Criteria API: 文字列で書かずに型安全に構築できるためタイプミスが起きにくい
  • どうしても DB ネイティブ SQL を投げたいときは createNativeQuery(sql) を使う

5. 古いHibernate 2系の場合

  • パッケージ net.sf.hibernateHibernate 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 — エンティティに該当プロパティが無い

関連