JPAで挿入クエリを作成する方法

というカラムを持つテーブルにデータを挿入しようとしています。

Query query = em.createQuery("INSERT INTO TestDataEntity (NAME, VALUE) VALUES (:name, :value)");
query.setParameter("name", name);
query.setParameter("value", value);
query.executeUpdate();

と表示され、以下のような例外が発生します。

ERROR org.hibernate.hql.internal.ast.ErrorCounter - line 1:42: unexpected token: VALUES 

また、ネイティブクエリによるレコードの挿入もできません。

Query query = em.createNativeQuery("INSERT INTO TEST_DATA (NAME, VALUE) VALUES (:name, :value);");
query.setParameter("name", name);
query.setParameter("value", value);
query.executeUpdate();

別の例外がスローされています。

javax.persistence.PersistenceException: org.hibernate.exception.SQLGrammarException: could not execute statement

質問です:

  • クエリ文字列のどこがおかしいのでしょうか?

ありがとうございました。

ソリューション

問題を解決しました。

これ]1による。

JPAにINSERT文はありません。

しかし、私はネイティブクエリで問題を解決することができました。私は間違ってクエリの最後に冗長な;を入れてしまったので、それを削除することで問題は解決しました。

解説 (0)

筆者は、ネイティブクエリでinsertを使用している例を2つ見つけました(12)。そうすると、クエリーは次のようになります。

Query query = em.createQuery("INSERT INTO TestDataEntity (NAME, VALUE) VALUES (?, ?)");
query.setParameter(1, name);
query.setParameter(2, value);
query.executeUpdate();

これを試してみてください。

解説 (1)

私は、以下の方法でこれを行うことができました - 私はちょうど2つのフィールドidとnameを持つBikeというテーブルを持っていました。私はそれをデータベースに挿入するために下記を使用しました。

Query query = em.createNativeQuery("INSERT INTO Bike (id, name) VALUES (:id    , :name);");
em.getTransaction().begin();
query.setParameter("id", "5");
query.setParameter("name", "Harley");
query.executeUpdate();
em.getTransaction().commit();
解説 (3)