Dati primaverili: “delete by” è supportato?

Sto usando Spring JPA per l’accesso al database. Sono in grado di trovare esempi come findByName e countByName, per i quali non devo scrivere alcuna implementazione del metodo. Spero di trovare esempi per eliminare un gruppo di record in base ad alcune condizioni.

Spring JPA supporta deleteByName-like delete? Qualsiasi puntatore è apprezzato.

Saluti e grazie.

Risposta obsoleta (Spring Data JPA <= 1.6.x) :

@Modifying annotazione in soccorso. Dovrai comunque fornire il tuo comportamento SQL personalizzato.

 @Transactional(readOnly = true) public interface UserRepository extends JpaRepository { @Modifying @Transactional @Query("delete from User u where u.firstName = ?1") void deleteUsersByFirstName(String firstName); } 

Aggiornare:

Nelle versioni moderne di Spring Data JPA (> = 1.7.x) derivazione di query per delete , remove e count operazioni è accessibile.

 public interface UserRepository extends CrudRepository { Long countByFirstName(String firstName); @Transactional Long deleteByFirstName(String firstName); @Transactional List removeByFirstName(String firstName); } 

La derivazione delle query di eliminazione utilizzando il nome del metodo specificato è supportata a partire dalla versione 1.6.0.RC1 di Spring Data JPA. Le parole chiave remove e delete sono supportate. Come valore di ritorno si può scegliere tra il numero o un elenco di entity framework rimosse.

 Long removeByLastname(String lastname); List deleteByLastname(String lastname); 

Se PartTreeJpaQuery un’occhiata al codice sorgente di Spring Data JPA, e in particolare alla class PartTreeJpaQuery , vedrete che si tenta di PartTree un’istanza di PartTree . All’interno di quella class la seguente espressione regolare

private static final Pattern PREFIX_TEMPLATE = Pattern.compile("^(find|read|get|count|query)(\\p{Lu}.*?)??By")

dovrebbe indicare cosa è permesso e cosa no

Ovviamente, se si tenta di aggiungere un tale metodo, si vedrà che non funziona e si ottiene lo stacktrace completo.

Devo notare che stavo usando la versione 1.5.0.RELEASE di Spring Data JPA

Se utilizzerai metodi di eliminazione predefiniti come forniti direttamente dal JPA di spring, allora il framework eseguirà due query al di sotto.

  • Per prima cosa raccogli dati (come id e altre colonne) usando la query execute select con delete query where.

  • quindi dopo aver ottenuto resultSet della prima query, verranno eseguite le seconde query per tutti gli id ​​(uno per uno)

    Nota: questo non è un modo ottimizzato per l’applicazione perché molte query verranno eseguite per una singola query di eliminazione di MySQL.

Questo è un altro modo ottimizzato per eliminare il codice di query perché verrà eseguita una sola query di eliminazione utilizzando i metodi personalizzati sotto.

 @NamedNativeQueries({ @NamedNativeQuery(name = "Abc.deleteByCreatedTimeBetween", query = "DELETE FROM abc WHERE create_time BETWEEN ?1 AND ?2") , @NamedNativeQuery(name = "Abc.getByMaxId", query = "SELECT max(id) from abc") }) @Entity public class Abc implements Serializable { } @Repository public interface AbcRepository extends CrudRepository { int getByMaxId(); @Transactional @Modifying void deleteByCreatedTimeBetween(String startDate, String endDate); }