使用 RawSqlBuilder.unparsed(sql).columnMapping(...) 手動映射欄位後,Ebean.findList() 返回實體屬性為 null 或預設值,但原生 SQL 直接執行有資料。
columnMapping 的「SQL 別名」→「實體屬性」對應錯誤(區分大小寫、底線/駝峰)。@Id 欄位必須在映射中,否則無法正確實體化物件。@ManyToOne 等關聯欄位需映射外鍵欄位(如 user_id),而非關聯物件。snake_case,映射到 camelCase 屬性。ebean.logging.sql=true,檢視實際執行 SQL。RawSqlBuilder 產生的 RawSql 物件 getColumnMapping() 與實體 @Column 註解。SqlQuery 執行原生 SQL 映射到 Map<String, Object> 驗證欄位名稱:List<Map<String, Object>> rows = Ebean.createSqlQuery(sql).findList();Map 有值但實體為 null,確為映射問題。String sql = "SELECT u.id AS user_id, u.name AS user_name, u.email " +
"FROM users u WHERE u.status = :status";
RawSql rawSql = RawSqlBuilder
.unparsed(sql)
.columnMapping("user_id", "User.id") // 實體屬性路徑
.columnMapping("user_name", "User.name")
.columnMapping("email", "User.email")
.create();
List users = Ebean.find(User.class)
.setRawSql(rawSql)
.setParameter("status", 1)
.findList();
Ebean RawSql 官方指南 — 含完整映射規則、巢狀物件映射、分頁與效能調優。