在 Oracle 資料庫客戶端直接執行 SQL 正常,但放入 Hibernate createSQLQuery() 執行卻拋出 java.sql.SQLException: ORA-00911: 無效字符,這是經典的「分號陷阱」。
原代碼結尾拼接:
sqlsb.append(" group by bb.datetime order by bb.datetime desc);");
// ↑ 這裡多了一個分號
; 作為語句結束符// 錯誤
sqlsb.append(" group by bb.datetime order by bb.datetime desc);");
// 正確:移除結尾分號
sqlsb.append(" group by bb.datetime order by bb.datetime desc)");
String sql = "SELECT * FROM users WHERE create_time >= :start AND create_time <= :end";
SQLQuery query = session.createSQLQuery(sql);
query.setParameter("start", startDate);
query.setParameter("end", endDate);
List
@NamedNativeQuery(
name = "User.findByDateRange",
query = "SELECT * FROM users WHERE create_time BETWEEN :start AND :end",
resultClass = User.class
)
// 使用
List users = session.getNamedQuery("User.findByDateRange")
.setParameter("start", start)
.setParameter("end", end)
.list();
StringBuilder sql = new StringBuilder("SELECT * FROM orders WHERE 1=1");
if (startDate != null) sql.append(" AND create_time >= :start");
if (endDate != null) sql.append(" AND create_time <= :end");
sql.append(" ORDER BY create_time DESC");
SQLQuery query = session.createSQLQuery(sql.toString());
if (startDate != null) query.setParameter("start", startDate);
if (endDate != null) query.setParameter("end", endDate);
;、全形括號)// 單行註釋,需用 --)總結:Hibernate/JDBC 執行原生 SQL 時,**絕不可在語句末尾加分號**。養成使用參數綁定、命名查詢的習慣,既能避免此類語法錯誤,又能防止 SQL 注入,提升代碼可維護性。