W MySQL mam dwie tabele tableA
i tableB
. Próbuję wykonać dwa zapytania:
executeQuery(query1)
executeQuery(query2)
Ale pojawia się następujący błąd:
can not issue data manipulation statements with executeQuery().
Co to znaczy?
W MySQL mam dwie tabele tableA
i tableB
. Próbuję wykonać dwa zapytania:
executeQuery(query1)
executeQuery(query2)
Ale pojawia się następujący błąd:
can not issue data manipulation statements with executeQuery().
Co to znaczy?
Odpowiedzi:
Aby manipulować danymi, których faktycznie potrzebujesz, executeUpdate()
a nie executeQuery()
.
Oto wyciąg z executeUpdate()
javadoc, który sam w sobie jest już odpowiedzią:
Wykonuje daną instrukcję SQL, która może być instrukcją INSERT, UPDATE lub DELETE albo instrukcją SQL, która nic nie zwraca, na przykład instrukcja SQL DDL.
Jeśli używasz rozruchu sprężynowego, po prostu dodaj adnotację @Modifying.
@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();
@Modifying(clearAutomatically = true) @Transactional
tuż nad adnotacją @Query definiującą moje zapytanie o usunięcie
Służy executeUpdate()
do wydawania instrukcji manipulacji danymi. executeQuery()
jest przeznaczony tylko dla zapytań SELECT (tj. zapytań, które zwracają zestaw wyników).
W przypadku zapytania o usunięcie - użyj przed @Modifying
i @Transactional
przed @Query
takimi jak: -
@Repository
public interface CopyRepository extends JpaRepository<Copy, Integer> {
@Modifying
@Transactional
@Query(value = "DELETE FROM tbl_copy where trade_id = ?1 ; ", nativeQuery = true)
void deleteCopyByTradeId(Integer id);
}
To nie da java.sql.SQLException: Can not issue data manipulation statements with executeQuery()
błędu.
Po to executeUpdate
jest.
Oto bardzo krótkie podsumowanie różnicy: http://www.coderanch.com/t/301594/JDBC/java/Difference-between-execute-executeQuery-executeUpdate
Ten kod działa dla mnie: ustawiam wartości z INSERT i otrzymuję LAST_INSERT_ID () tej wartości z SELECT; Używam java NetBeans 8.1, MySql i java.JDBC.driver
try {
String Query = "INSERT INTO `stock`(`stock`, `min_stock`,
`id_stock`) VALUES ("
+ "\"" + p.get_Stock().getStock() + "\", "
+ "\"" + p.get_Stock().getStockMinimo() + "\","
+ "" + "null" + ")";
Statement st = miConexion.createStatement();
st.executeUpdate(Query);
java.sql.ResultSet rs;
rs = st.executeQuery("Select LAST_INSERT_ID() from stock limit 1");
rs.next(); //para posicionar el puntero en la primer fila
ultimo_id = rs.getInt("LAST_INSERT_ID()");
} catch (SqlException ex) { ex.printTrace;}
@Modifying
@Transactional
@Query(value = "delete from cart_item where cart_cart_id=:cart", nativeQuery = true)
public void deleteByCart(@Param("cart") int cart);
Nie zapomnij dodać @Modifying i @Transnational przed @query. mi to pasuje.
Aby usunąć rekord z jakimś stanem za pomocą natywnego zapytania z JPA, ważne są wspomniane wyżej adnotacje.
Oprócz funkcji executeUpdate () w nawiasach należy również dodać zmienną, aby używać instrukcji SQL.
Na przykład:
PreparedStatement pst = connection.prepareStatement(sql);
int numRowsChanged = pst.executeUpdate(sql);