スポンサーリンク

Doma2のエラー・例外

[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文を実行しようとしたが、主キーとなるカラムに値が設定されていない。

<<解決策>>

  1. 値をセットし忘れている場合、値をセットするようコードを修正する。
  2. エンティティに@GeneratedValueを付与する。
  3. テーブル定義で主キーカラムに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など任意の値)が必要である。

スポンサーリンク

投稿日:2021年2月11日 更新日:

Copyright© 【Spring Hack】 , 2022 All Rights Reserved Powered by AFFINGER5.