【エンジニア日記#2】jpaRepositoryでうまいことInsert文が作れなかった話

雑談

こんばんは現役エンジニアのuhaです。エンジニア日記2回目です。この日記は続けることを目標にしたいので情報の信憑性とか正確性、丁寧さにはあまりこだわりすぎないようにしようと思います。

今回はSpringの勉強中に起こったエラーについて書いていきます。

JpaRepositoryでエラーが出た話

私は現在新しい技術としてspringの学習をしています。そして今日は画面から受け取ったパラメータをもとにJpaRepositoryを使ってDBにデータを登録(Insert)する処理を記述していました。

JpaRepositoryでは元々saveメソッドが用意されていて、引数としてDBに登録したいエンティティを渡すことでInsertもしくはUpdateが実行されるようです。

しかし私はInsert文を自分で構築する必要があったので、Repositoryクラス内にメソッドを一つ用意して、@Queryアノテーションを使ってSQLを構築しました。

こんな感じのメソッドを用意しました。

    /**
     * Todo新規作成
     */
    @Query("INSERT INTO todo"
        +  " (todo_content, "
        +  "time_limit) "
        +  " VALUES "
        +  "(:todoContent,"
        +  " :timeLimit)"
        )
    public Integer createTodo(@Param("todoContent") String todoContent,
        @Param("timeLimit")Date timeLimit);

しかしこれを実行しようとするとエラーが出て実行することができませんでした。調べてもなかなか理由がわからなかったのですが、いろんなサイトに出てくるものを組み合わせて以下のように修正したらうまく動きました。

/**
     * Todo新規作成
     */
    @Modifying
    @Transactional
    @Query(value="INSERT INTO todo"
        +  " (todo_content, "
        +  "time_limit) "
        +  " VALUES "
        +  "(:todoContent,"
        +  " :timeLimit)",
        nativeQuery = true)
    public Integer createTodo(@Param("todoContent") String todoContent,
        @Param("timeLimit")Date timeLimit);

追加した要素としては「@Modifiying」「@Transactional」のアノテーションと@Queryの引数としてvalue=SQLにしたことと、「nativeQuery=true」の追加です。

上記の記述は全て何をしているかわかりません。わからないことを書くことに抵抗がありますが、一旦動いたので良しとします(ダメなのはわかってるけど、みんなあるよね…?)

勉強することが増えました!また勉強した結果とかも日記で書けたらいいですね。

泣き言

上記のSpringプロジェクトはdockerで環境を作って開発しているのですが、一度Docker-composeをStopして再びStartさせたらビルドエラーでvsCodeが真っ赤になっています。

明日はまずこのエラーに対応しなければならないです… 多分gradleで記述している依存関係がうまいこといってないのが原因だと思うけど、具体的な解決策はわからない。

もうdockerやめて大人しくローカルで開発しようかな…

まだまだ先は長い

spring学習におすすめの書籍は以下

コメント

タイトルとURLをコピーしました