web-dev-qa-db-fra.com

mise à jour de la valeur booléenne dans les données de printemps jpa à l'aide de @Query, avec hibernate

J'ai Spring-data et hibernate configuré et en cours d'exécution. Je peux enregistrer des enregistrements à l'aide de spring-data mais pour une raison quelconque, je ne suis pas en mesure d'exécuter une requête qui mettra à jour tous les champs booléens d'une table.

J'ai essayé ceci:

@Query("update Content v set v.published = false where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division, 
                         @Param("section") String section);

J'ai également essayé ceci:

 @Query("update Content v set v.published = 0 where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division, 
                         @Param("section") String section);

La division et la section des paramètres se réalisent mais aucun changement sur la table.

p.s. J'utilise également la base de données mysql.

36
aki

J'utilise Spring 3.1 et Spring JPA Data. J'avais un problème similaire. J'obtenais constamment une erreur en essayant de mettre à jour plusieurs enregistrements dans 1 requête.

Donc, j'avais quelque chose comme ça.

@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);

Erreur:

org.hibernate.hql.QueryExecutionRequestException: Not supported for DML operations

Donc, après avoir googlé pendant un certain temps, j'ai découvert que vous deviez ajouter @Modifying.

@Modifying  
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);

Mais alors j'obtenais l'erreur suivante:

...    
nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; 
nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query
...

Donc, j'ai pensé que mon problème était maintenant un problème de transaction et je suis retourné sur Google pour le rechercher et j'ai découvert que vous devez ajouter @Transactional maintenant. Il semble que @Modifying nécessite également @Transactional.

@Modifying  
@Transactional
@Query("UPDATE User u SET u.state = ?1 WHERE u.server.id = ?2")
public void updateAllUsers(long state, long serverid);

mais j'ai eu l'erreur suivante:

No value for key [org.Apache.commons.dbcp.BasicDataSource (...) ] bound to thread

Encore une fois, j'ai googlé pendant un certain temps et suis arrivé à la conclusion que ma configuration était incorrecte et que cela s'est avéré vrai. Il me manquait quelques configs xml.

<beans:bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager">
    <beans:property name="entityManagerFactory" ref="entityManagerFactory"/>
</beans:bean>

<tx:annotation-driven transaction-manager="transactionManager"/>

Ce fut un long voyage mais je l'ai finalement fait fonctionner. J'espère que cela aidera quelqu'un, en essayant de "payer en avant" comme beaucoup d'autres m'ont aidé avec leurs merveilleux blogs, réponses et commentaires.

111
TchiYuan

Pour exécuter la modification des requêtes, vous devez annoter la méthode avec un @Modifying comme indiqué dans la documentation de référence comme ceci:

@Modifying
@Query("update Content v set v.published = false where v.division = :division and v.section = :section")
void unPublishContent(@Param("division") String division, 
                     @Param("section") String section);
9
Oliver Drotbohm

Pour moi aussi, cela a fonctionné avec les annotations suivantes:

@Modifying
@Query("update User u set u.active=1 where a.id=?1")
@Transactional
void  activeUser(Long id);
8
Tanja

Pour moi, cela a fonctionné avec les annotations suivantes:

@Modifying
@Query("update JsonContactImport x set x.isImported = true where x.id in :ids")
@Transactional
void updateImported(@Param("ids")  List<Long> ids);
4
romu31

En travaillant avec Spring 5, l'annotation @Transactional est toujours requise.

@Repository
public interface DoorStyleRepository extends JpaRepository<DoorStyle, Long> {

    @Modifying
    @Transactional
    @Query("UPDATE DoorStyle ds SET ds.enabled = false")
    void setEnabledFalse();
}
0
Vlad Palnik