2017-09-08 25 views
1

spring-data-jpaで一括更新(JPA 2.1)を実行する際に問題が発生しています。ドキュメントによると結合によるバネデータjpaによる一括更新

5.3.8。クエリの変更 上記のすべてのセクションでは、特定のエンティティまたはエンティティの集合にアクセスするためにクエリを宣言する方法について説明しています。もちろん、Springデータリポジトリのカスタム実装で説明した機能を使用して、カスタムの変更動作を追加することもできます。私は更新が持っている必要

@Modifying 
@Query("update User u set u.firstname = ?1 where u.lastname = ?2") 
int setFixedFirstnameFor(String firstname, String lastname); 

しかし実体を:このアプローチは、包括的なカスタム機能のための実現可能であるとして、あなたは実際にのみ@Modifyingでクエリメソッドに注釈を付けることにより、結合パラメータを必要とするクエリを変更の実行を達成することができます@ManyToOne他のエンティティとの関係。

@Entity 
@Table(name = "usuarios", indexes = { 
    @Index(name = "idx_usuarios_rut", columnList = "rut") 
    ,@Index(name = "idx_usuarios_email", columnList = "email")}) 
public class User extends BaseEntity implements UserDetails { 
    ... 

    @NotNull(message = "Debe seleccionar un nivel") 
    @ManyToOne(fetch = FetchType.LAZY) 
    public Role getRole() { 
     return role; 
    } 
} 

だから私のUPDATE次のとおりです。

@Modifying 
@Transactional 
@Query("update User u set u.password = ?2 where u.company = ?1 and u.role.name not in ('ROLE_ADMIN', 'ROLE_ROOT')") 
int updatePasswordForAll(Company company, String password); 

たネイティブクエリupdate usuarios cross join set password=? where company_id=? and (nombre not in ('ROLE_ADMIN' , 'ROLE_ROOT'))はので、私は私が間違っているのは何com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual ...

を取得していますか?

私は

@Query("update User u set u.password = ?2 join u.role r where u.company = ?1 and r.name not in ('ROLE_ADMIN', 'ROLE_ROOT')") 

と試みたが、これは悪い形成された更新文org.hibernate.QueryException: node to traverse cannot be null! [update cl.arvisoft.mantenimiento.jpa.User u set u.password = ?2 join u.role r where u.company = ?1 and r.name not in ('ROLE_ADMIN', 'ROLE_ROOT')]です。

答えて

1

JPQLでは、更新操作を実行するときにエンティティに参加できません(referenceを参照)。このような状況を回避するには

は、このようなサブ選択、何か(テストしていません)を使用してみてください:Cepr0 @

update 
    User u 
set 
    u.password = ?2 
where 
    u.company = ?1 and 
    u.role in (select r from Role r where r.name not in ('ROLE_ADMIN', 'ROLE_ROOT')) 
+0

おかげで、今で生成されたネイティブの更新文は、更新です=設定したパスワードをusuarios?どこcompany_id =?と(role_id((ROLE_ADMIN、ROLE_ROOT)))にはない)role1_.nidがロールrole1_のrole1_.idから選択します)。 – rvillablanca

関連する問題