質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.01%

spring jpaのjpqlのエラー

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,906

isacRu

score 51

【状況】
ユーザのJpaRepositoryインターフェースに宣言したJPQLを使用したら、意味不明のエラーがでてしまって困っています。

Userエンティティクラス

import java.util.Date;
import java.util.List;

import javax.persistence.*;

import lombok.Getter;
import lombok.Setter;
import lombok.ToString;

@Getter
@Setter
@ToString
@Entity
@Table(name = "m_user")
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)    
    private Long id;
    private String username;
    private Date create_at;
    private Date update_at;

    @Transient
    private List<MinutesKind> minutesKind;

    @Transient
    private List<Authority> authority;

    public User() {
    }

    public User(List<MinutesKind> minutesKind) {
        this.minutesKind = minutesKind;
    }

    public User(List<MinutesKind> minutesKind,List<Authority> authority) {
        this.minutesKind = minutesKind;
        this.authority = authority;
    }
}


UserRepositoryインターフェース

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;

import com.jpa.test.model.User;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);

    @Query(value = "insert into m_user(username) values(?1)",nativeQuery=true)
    void insertUser(String username); 
}

ユーザ作成のControllerクラス

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.jpa.test.model.User;
import com.jpa.test.repository.UserRepository;

@Controller
public class UserController {

    @Autowired
    private UserRepository userRepository;

    @RequestMapping(value = "/userCreate", method = RequestMethod.GET)
    public String getInput(Model model) {

        User user = new User();
        model.addAttribute(user);
        return "userCreate";
    }

    @RequestMapping(value = "/userCreate", method = RequestMethod.POST)
    public String postInput(@ModelAttribute User user) {

        userRepository.insertUser(user.getUsername());
        return "redirect:/userCreate";
    }
}


以上を踏まえて「ResultSetを抽出することができませんでした」や「executeQuery()とデータ操作文を発行することはできません」といったエラーがでてしまいます。なぜなのかが疑問で困っています。なぜクエリーが実行できていないのかわかる方また、解決策がある方教えて下さい。以上、宜しくお願い致します。

※通常ならばこの場合、userRepository.save(モデル名)で簡単にinsertできますが、ある特定のプロパティを保存したい場合はどうすれば良いのかと思った。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

+1

なんとか解決した。UserRepositoryインタフェースのところに注釈@Modifying@Transactionalを追加すればいけた。

import javax.transaction.Transactional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;

import com.jpa.test.model.User;

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);

    @Modifying
    @Transactional
    @Query(value = "insert into m_user(username) values(?1)",nativeQuery=true)
    void insertUser(String username);
}


参考サイト

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる