In MySQL heb ik twee tabellen, tableA
en tableB
. Ik probeer twee queries uit te voeren:
executeQuery(query1)
executeQuery(query2)
Maar ik krijg de volgende foutmelding:
can not issue data manipulation statements with executeQuery().
Wat betekent dit?
Antwoord 1, autoriteit 100%
Om gegevens te manipuleren heb je eigenlijk executeUpdate()
in plaats van executeQuery()
.
Hier is een uittreksel uit de javadoc executeUpdate()
die al een antwoord op zich is:
Voert de gegeven SQL-instructie uit, die een INSERT-, UPDATE- of DELETE-instructie kan zijn of een SQL-instructie die niets teruggeeft, zoals een SQL DDL-instructie.
Antwoord 2, autoriteit 20%
Bij het uitvoeren van de DML-instructie moet u executeUpdate
/execute
gebruiken in plaats van executeQuery
.
Hier is een korte vergelijking:
Antwoord 3, autoriteit 17%
Als je spring boot gebruikt, voeg dan gewoon een @Modifying-annotatie toe.
@Modifying
@Query
(value = "UPDATE user SET middleName = 'Mudd' WHERE id = 1", nativeQuery = true)
void updateMiddleName();
Antwoord 4, Autoriteit 13%
Voor het verwijderen van query – gebruik @Modifying
en @Transactional
vóór de @Query
zoals: –
@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);
}
Het geeft niet de java.sql.SQLException: Can not issue data manipulation statements with executeQuery()
fout.
bewerken:
Aangezien dit antwoord veel upvotes krijgt, raadpleeg ik u ook naar de documentatie voor meer begrip.
By default, CRUD methods on repository instances are transactional. For read operations,
the transaction configuration readOnly flag is set to true.
All others are configured with a plain @Transactional so that default transaction
configuration applies.
Indicates a query method should be considered as modifying query as that changes the way
it needs to be executed. This annotation is only considered if used on query methods defined
through a Query annotation). It's not applied on custom implementation methods or queries
derived from the method name as they already have control over the underlying data access
APIs or specify if they are modifying by their name.
Queries that require a @Modifying annotation include INSERT, UPDATE, DELETE, and DDL
statements.
Antwoord 5, Autoriteit 8%
Gebruik executeUpdate()
om gegevensmanipulatie-verklaringen uit te geven. executeQuery()
is alleen bedoeld voor Select-query’s (d.w.z. query’s die een resultaat instellen) retourneren).
Antwoord 6, Autoriteit 2%
Dat is wat executeUpdate
is voor.
Hier is een zeer korte samenvatting van het verschil: http://www.coderanch.com/t/301594/jdbc/java/difference-between-execute-executequery-executeUpdate
Antwoord 7, Autoriteit 2%
Deze code werkt voor mij: ik heb waarden ingesteld met een insert en ontvang de last_inert_id () van deze waarde Whit A Select; Ik gebruik Java Netbeans 8.1, MySQL en 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;}
Antwoord 8, Autoriteit 2%
@Modifying
@Transactional
@Query(value = "delete from cart_item where cart_cart_id=:cart", nativeQuery = true)
public void deleteByCart(@Param("cart") int cart);
Vergeet niet @Modifying en @Transnational toe te voegen vóór @query. het werkt voor mij.
Om het record met een bepaalde voorwaarde te verwijderen met behulp van native query met JPA, zijn de bovengenoemde annotaties belangrijk.
Antwoord 9
executeQuery()
retourneert een ResultSet
. Ik ben niet zo bekend met Java/MySQL, maar om indexen te maken heb je waarschijnlijk een executeUpdate()
nodig.
Antwoord 10
Behalve executeUpdate() tussen haakjes, moet u ook een variabele toevoegen om een SQL-instructie te gebruiken.
Bijvoorbeeld:
PreparedStatement pst = connection.prepareStatement(sql);
int numRowsChanged = pst.executeUpdate(sql);