2017-01-16 1 views
0

Dans le référentiel QueryDSL, je peux faire une requête nommée ainsi:Spring Boot: JPA QueryDSL: Comment effectuer une suppression nommée?

public interface HistoricalDataRepository 
    extends PagingAndSortingRepository<HistoricalData, Long>, 
      QueryDslPredicateExecutor<HistoricalData> { 

    List<HistoricalData> findAll(Predicate predicate); 

    HistoricalData findByKeyAndDate(String key, String date); 

    @Query(value = "SELECT * FROM historical_data h WHERE " 
     + " h.key = :key " 
     + " AND h.date <= :date " 
     + " order by date desc" 
     + " limit 1" 
     , nativeQuery = true) 
    HistoricalData myFindByKeyLowerOrEqualToDate(
     @Param("key") String key 
     , @Param("date") Date date 
); 

Comment puis-je effectuer une

DELETE FROM HISTORICAL_DATA; 

Si j'utilise la même syntaxe que ci-dessus (avec l'annotation @Query) , je reçois une exception:

org.springframework.orm.jpa.JpaSystemException: 
could not extract ResultSet; nested exception is 
org.hibernate.exception.GenericJDBCException: could not extract ResultSet 

Contexte: Je ne veux pas utiliser un

historicalDataRepository.deleteAll(); 

car cela a une très faible performance.

EDIT:

Ma syntaxe ressemblerait à ce qui suit:

@Query(value = "DELETE FROM HISTORICAL_DATA", nativeQuery = true) 
void myDeleteAll(); 
+0

Si vous êtes ouvert à l'extension de votre dépôt de 'JpaRepository' (qui étend' PagingAndSortingRepository'), '' JpaRepository' fournit un deleteAllInBatch 'méthode. Si ce n'est pas le cas, ajoutez le code de la méthode à laquelle vous avez ajouté la requête affichée. – manish

+0

J'ai ajouté le code. – user2145488

+0

Avez-vous marqué la méthode 'myDeleteAll' avec' @ Modifying' et '@ Transactional'? Assurez-vous de lire [la documentation officielle] (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.modifying-queries) pour comprendre les nuances autour des requêtes susceptibles de modifier les données sous-jacentes. – manish

Répondre

0

On dirait, vous Combinant à la fois la requête JPA ainsi que requête native. Pour la syntaxe que vous avez donné, vous devez spécifier comme natif comme indiqué ci-dessous

@Query(value = "DELETE FROM HISTORICAL_DATA", nativeQuery = true) 
+0

cela conduit à une erreur d'exécution comme écrit dans la question. – user2145488