ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
このエラーの典型
Hibernate / JPA でクエリ実行時に次のような例外が出ます:
org.hibernate.QueryException: unexpected token: as [SELECT u FROM user as u]
at org.hibernate.hql.internal.ast.QuerySyntaxException.convert(...)
at org.hibernate.hql.internal.ast.ErrorCounter.throwQueryException(...)
...
Caused by: NoViableAltException(...)
# 旧 net.sf.hibernate 系
net.sf.hibernate.QueryException: unexpected token: as [from order o where o.id = ?]
HQL / JPQL の文法的に as というトークンが想定外の位置に出てきた、という意味です。
原因 1: HQL でテーブル名を直接書いている
HQL は エンティティクラス参照で書きます。SQL のようにテーブル名で書くと、Hibernate は「エンティティが見つからない → 予約語? → パース失敗」となります。
// ❌ NG: テーブル名で書いている
String hql = "SELECT u FROM user_table as u WHERE u.id = :id";
Query q = em.createQuery(hql);
// ✅ OK: エンティティ名で書く
String jpql = "SELECT u FROM User u WHERE u.id = :id";
Query q = em.createQuery(jpql, User.class);
// エンティティ定義側
@Entity
@Table(name = "user_table") // DB 上のテーブル名
public class User {
@Id
@Column(name = "user_id")
private Long id;
}
原因 2: 予約語が含まれている
テーブル名・カラム名が user / order / group / desc / key のような SQL 予約語の場合、Hibernate は HQL → SQL 変換時にエスケープせず生成し、結果として unexpected token や SQLGrammarException が起きます。
| 予約語の例 | 使ってしまうと起きる現象 |
|---|---|
user | PostgreSQL で syntax error at or near "user" |
order | ORDER BY と被って unexpected token |
group | GROUP BY と衝突 |
desc / asc | ソート方向と衝突 |
key / type | MySQL で You have an error in your SQL syntax |
対処 1: @Table / @Column でエスケープ
@Entity
@Table(name = "`order`") // MySQL バックティック
// @Table(name = "\"order\"") // PostgreSQL ダブルクォート
public class OrderEntity {
@Id
@Column(name = "order_id")
private Long id;
@Column(name = "`group`") // カラム名も予約語ならエスケープ
private String group;
}
// Hibernate 標準のエスケープ記法(DB ベンダー非依存)
@Table(name = "\"order\"") // Hibernate が DB に応じて変換
application.properties で 常にエスケープさせる設定もあります:
# Spring Boot
spring.jpa.properties.hibernate.globally_quoted_identifiers=true
# Hibernate 直設定
hibernate.globally_quoted_identifiers=true
対処 2: HQL の AS の正しい使い方
HQL / JPQL で AS が許される位置は限定的です:
// ✅ エンティティのエイリアス(AS は省略可)
"FROM User AS u"
"FROM User u" // 同じ意味
// ✅ SELECT 句のカラムエイリアス
"SELECT u.name AS userName FROM User u"
// ❌ NG: JOIN の ON にカラムエイリアスを書く
"SELECT u FROM User u JOIN Order AS o ON u.id = o.userId"
// → JPQL 2.1 以降は JOIN ... ON 自体は OK だが、エイリアス位置に注意
// ❌ NG: テーブル名で書く
"FROM user_table AS u"
対処 3: ネイティブ SQL に逃がす
どうしても複雑な SQL を書きたい場合は createNativeQuery() でネイティブ SQL を使い、結果を Entity マッピングします:
@PersistenceContext
EntityManager em;
// ネイティブ SQL
List<User> users = em.createNativeQuery(
"SELECT * FROM `user` WHERE created_at > ?1",
User.class
).setParameter(1, since).getResultList();
// Spring Data JPA でも @Query(nativeQuery = true)
public interface UserRepository extends JpaRepository<User, Long> {
@Query(value = "SELECT * FROM `user` WHERE created_at > ?1", nativeQuery = true)
List<User> findRecent(LocalDateTime since);
}
デバッグの定石
# application.properties で実 SQL を出力
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type.descriptor.sql.BasicBinder=TRACE
実際に投げられる SQL を見れば、予約語エスケープ漏れか HQL の文法ミスかすぐ判別できます。
FAQ
Q: 旧 net.sf.hibernate と現在の org.hibernate で違いは?
A: net.sf.hibernate は Hibernate 2 系(2006 以前)。基本同じ問題ですが、新規プロジェクトは Hibernate 6.x + JPA 標準を推奨。
Q: @Table の name に予約語を入れたくない
A: テーブル名を app_user / orders に変える DB 設計が王道です。
Q: JPQL と HQL は同じ?
A: JPQL は仕様、HQL は Hibernate 独自拡張。基本構文は共通で、HQL の方が機能が広い(WITH 句等)。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
- ids for this class must be manually assigned before calling save()
- Number of positional parameter types (1 does not match number of positional parameters (2)
- net.sf.hibernate.MappingException: No persister for ~
- net.sf.hibernate.QueryException: unexpected token: as [~]
- net.sf.hibernate.MappingException: Error reading resource
- IllegalArgumentException occurred while calling setter of
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?