Contents
- 1 [DOMA4007] 戻り値のjava.util.Listに対する実型引数の型[xxx]はサポートされていません。
- 2 [DOMA4019] ファイル[META-INF/xxx.sql]がクラスパスから見つかりませんでした。ファイルの絶対パスは"C:\xxx.sql"です。
- 3 [DOMA4069] SQLファイル[META-INF/xxx.sql]の妥当検査に失敗しました
- 4 [DOMA4092] SQLファイル[META-INF/xxx.sql]の妥当検査に失敗しました
- 5 [DOMA4122] SQLファイル[META-INF/xxx.sql]の妥当検査に失敗しました。メソッドのパラメータ[yyy]がSQLファイルで参照されていません。
- 6 [DOMA2002] カラム[yyy]が結果セットに含まれますが、このカラムにマッピングされたプロパティがエンティティクラス[xxx]に見つかりません。UnknownColumnException:
- 7 [DOMA2020] エンティティ[xxx]のIDプロパティ[yyy]に値が設定されていません。IDのプロパティに@GeneratedValueが指定されていない場合、INSERTの実行にはIDプロパティの設定が必須です。
- 8 [DOMA2110] SQLの解析に失敗しました。バインド変数コメントもしくはリテラル変数コメント[/* xxx */]の直後にテスト用のリテラルもしくは括弧が見つかりません。
[DOMA4007] 戻り値のjava.util.Listに対する実型引数の型[xxx]はサポートされていません。
Doma2では、クエリ結果を格納するクラスは@Entityを付与する必要があります。
<<修正前>>
@Data
@EqualsAndHashCode(callSuper=false)
public class BookLendStatus extends MBook {
private LocalDateTime returnPlanAt;
}
<<修正後>>
@Entity
@EqualsAndHashCode(callSuper=false)
public class BookLendStatus extends MBook {
private LocalDateTime returnPlanAt;
}
[DOMA4019] ファイル[META-INF/xxx.sql]がクラスパスから見つかりませんでした。ファイルの絶対パスは"C:\xxx.sql"です。
D:\springhack\happy-library-api\src\main\java\com\springhack\happylibrary\dao\BookDao.java:18:
エラー: [DOMA4019] ファイル[META-INF/com/springhack/happylibrary/dao/BookDao/selectByHoge.sql]がクラスパスから見つかりませんでした。ファイルの絶対パスは"D:\springhack\happy-library-api\build\classes\java\main\META-INF\com\springhack\happylibrary\dao\BookDao\selectByHoge.sql"です。
List<MBook> selectByHoge();
^
@Daoクラスにメソッド定義があるが、該当するSQLファイルが想定の場所に見つからない場合に発生する。
解決策は、
@Daoクラスのメソッド定義が不要であれば、メソッド定義を削除する。
必要なメソッドであれば、SQLファイルを規定の場所に配置する。規定の場所はログ後半の「ファイルの絶対パスは・・・」以降に記載されている。
[DOMA4069] SQLファイル[META-INF/xxx.sql]の妥当検査に失敗しました
DOMA4069はSQLの解析失敗時の親エラーコードである。解析失敗理由はログに「原因は次のものです。」以下のエラー内容を確認すること。
エラー: [DOMA4069] SQLファイル[META-INF/com/springhack/happylibrary/dao/BookDao/searchByConditions.sql]の解析に失敗しました。原因は次のものです。org.seasar.doma.jdbc.JdbcException: [DOMA2110] SQLの解析に失敗しました。([6]行目[26]番目の文字付近)。バインド変数コメントもしくはリテラル変数コメント[/* bookId */]の直後にテスト用のリテラルもしくは括弧が見つかりません。SQL[ select
List<MBook> searchByConditions(Integer bookId);
このときのSQLは次の通り。
select
/*%expand*/*
from
m_book
where
book_id = /* bookId */
/ * bookId */の後にデフォルト値を記述していないため、解析エラーとなっている。
仮にこれをそのままSQLとして実行しようとすると、次のようなエラーになる。
42000 You have an error in your SQL syntax というSQL文法エラーになる。
修正するには、次のようにデフォルト値を記述すること。
select
/*%expand*/*
from
m_book
where
book_id = /* bookId */1
[DOMA4092] SQLファイル[META-INF/xxx.sql]の妥当検査に失敗しました
DOMA4092はSQL自体の妥当検査に失敗したときに発生する。
発生理由は、ログに記載されている「詳細は次のものです。」以下のエラー内容を確認すること。
エラー: [DOMA4092] SQLファイル[META-INF/com/springhack/happylibrary/dao/BookDao/searchByConditions.sql]の妥当検査に失敗しました([6]行目[26]番目の文字付近)。詳細は次のものです。[DOMA4067] SQL内の変数[bookId]に対応するパラメータがメソッドに存在しません([6]番目の文字付近)。
上記エラーが発生したコードは下記の通り。
@Select
List<MBook> searchByConditions();
select
/*%expand*/*
from
m_book
where
book_id = /* bookId */1
SQLでは、where句で埋め込みパラメータbookIdを指定しているが、@Daoのメソッド引数として、bookIdが記載されていないため、妥当検査に引っかかっている。
次のように、@Daoのメソッド引数として、bookIdを記載すると妥当検査に通るようになる。
List<MBook> searchByConditions(Integer bookId);
妥当検査に引っかかった理由ごとにエラー番号が割り振られているため、DOMA4092が発生したときは、コンソールのエラー番号をしっかり確認すること。
[DOMA4067] SQL内の変数[yyy]に対応するパラメータがメソッドに存在しません
SQL内で使われている埋め込みパラメータが、@Daoの対応するメソッドの引数に指定されていない。
<<修正前>>
List<MBook> searchByConditions();
select
/*%expand*/*
from
m_book
where
book_id = /* bookId */1
SQL内の bookId が @Daoで受け取れるようになっていない。
<<修正後>>
List<MBook> searchByConditions(Integer bookId);
[DOMA4122] SQLファイル[META-INF/xxx.sql]の妥当検査に失敗しました。メソッドのパラメータ[yyy]がSQLファイルで参照されていません。
エラー: [DOMA4122] SQLファイル[META-INF/com/springhack/happylibrary/dao/BookDao/searchByConditions.sql]の妥当検査に失敗しました。メソッドのパラメータ[bookId]がSQLファイルで参照されていません。
List<MBook> searchByConditions(Integer bookId);
^
DOMA4122はDOMA4067の逆パターン。メソッドの引数には存在するが、SQLでは使用されていないという時に発生する。
@Select
List<MBook> searchByConditions(Integer bookId);
select
/*%expand*/*
from
m_book
上の例では、searchByConditionsメソッドの引数であるInteger bookIdがSQLで使用されていない。
SQLで使用するか、メソッド引数を削除するかして、メソッド引数とSQLを整合する必要がある。
[DOMA2002] カラム[yyy]が結果セットに含まれますが、このカラムにマッピングされたプロパティがエンティティクラス[xxx]に見つかりません。UnknownColumnException:
2021-02-13 11:39:41.427 ERROR 11128 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.TypeMismatchDataAccessException: [DOMA2002] カラム[return_at]が結果セットに含まれますが、このカラムにマッピングされたプロパティがエンティティクラス[com.springhack.happylibrary.dao.dto.BookLendStatus]に見つかりません。次の3つの内のいずれかの対応が必要です。1)エンティティクラスに[return_at]という名前のプロパティを定義する。2)任意の名前のプロパティに@Columnを注釈し@Columnのname要素に[return_at]を指定する。3)UnknownColumnHandlerに未知のカラムを無視するような実装をしorg.seasar.doma.jdbc.Configに設定する。
SQLファイルパス=[META-INF/com/springhack/happylibrary/dao/BookLendDao/searchByConditions.sql]。
解決策:SELECT文の結果に含まれるカラムが、結果を格納するDTO(@Entity)に存在することを確認する。DTOのフィールド名が誤っていないか、欠落していないか、または、SELECT句で取得したい項目名が誤っていないか確認する。
<<修正前>>
@Entity
@EqualsAndHashCode(callSuper=false)
public class BookLendStatus extends MBook {
private LocalDateTime returnPlanAt;
}
select
mb.* ,
tbl.return_at
from
m_book mb
left join
t_book_lend tbl
on mb.book_id = tbl.book_lend_id
<<修正後>>
select
mb.* ,
tbl.return_plan_at
from
m_book mb
left join
t_book_lend tbl
on mb.book_id = tbl.book_lend_id
今回の場合はSQL側のカラム名が意図したものと異なっていました。
[DOMA2020] エンティティ[xxx]のIDプロパティ[yyy]に値が設定されていません。IDのプロパティに@GeneratedValueが指定されていない場合、INSERTの実行にはIDプロパティの設定が必須です。
2021-02-14 11:44:06.842 ERROR 12860 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.seasar.doma.boot.DomaPersistenceExceptionTranslator$1: [DOMA2020] エンティティ[TBookReservation]のIDプロパティ[bookReserveId]に値が設定されていません。IDのプロパティに@GeneratedValueが指定されていない場合、INSERTの実行にはIDプロパティの設定が必須です。; nested exception is org.seasar.doma.jdbc.JdbcException: [DOMA2020] エンティティ[TBookReservation]のIDプロパティ[bookReserveId]に値が設定されていません。IDのプロパティに@GeneratedValueが指定されていない場合、INSERTの実行にはIDプロパティの設定が必須です。] with root cause
org.seasar.doma.jdbc.JdbcException: [DOMA2020] エンティティ[TBookReservation]のIDプロパティ[bookReserveId]に値が設定されていません。IDのプロパティに@GeneratedValueが指定されていない場合、INSERTの実行にはIDプロパティの設定が必須です。
INSERT文を実行しようとしたが、主キーとなるカラムに値が設定されていない。
<<解決策>>
- 値をセットし忘れている場合、値をセットするようコードを修正する。
- エンティティに@GeneratedValueを付与する。
- テーブル定義で主キーカラムにAUTO_INCREMENTを付与する。
[DOMA2110] SQLの解析に失敗しました。バインド変数コメントもしくはリテラル変数コメント[/* xxx */]の直後にテスト用のリテラルもしくは括弧が見つかりません。
DOMA2110は「[DOMA4069]SQLファイル[META-INF/xxx.sql]の妥当検査に失敗しました」の詳細エラーとして表れる。
DOMA4069でも例を出したが、次のようにSQLのエラーである。
select
/*%expand*/*
from
m_book
where
book_id = /* bookId */
select
/*%expand*/*
from
m_book
where
book_id = /* bookId */1
このように、DOMAの2-way-SQLでは、埋め込みパラメータ(上例ではbookId)の後にデフォルト値(1など任意の値)が必要である。