2017-02-25 4 views
1

私は助けてください。私のデータベースの1つのフィールドを更新していますが、JPAクエリーを使用するとあまりよくありません。私はまだ学んでいる。JPAクエリーを使用して単一のフォームを更新する方法

@Entity 
public class CertificateProgramme { 

     @Id 
     @GeneratedValue(strategy = GenerationType.IDENTITY) 
     private Long id; 

     @NotNull(message = "The above field must not be blank.") 
     @Pattern(regexp="[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\." 
       +"[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@" 
       +"(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?", 
       message="Please enter a valid email address") 
     private String email; 

     private boolean flag; 

フラグフィールドをfalseに更新します。私はserviceImplクラスでsaveメソッドを使用しているときに更新できますが、保存せずに試しても機能しません。

私はサービスインターフェースのメソッドunFlagger (CertificateProgramme certificateProgramme)がServiceImpl

に実装されるように定義

public interface CertificateService { 
    List<CertificateProgramme> findAll(); 
    CertificateProgramme ListAll(); 
    CertificateProgramme findOne(Long id); 
    void save(CertificateProgramme certificateProgramme); 
    CertificateProgramme flagger(CertificateProgramme certificateProgramme); 
    CertificateProgramme unFlagger(CertificateProgramme certificateProgramme); 
} 

ServiceImpl.java

@Override 
public CertificateProgramme flag(CertificateProgramme certificateProgramme) { 
    certificateDao.unFlagger(certificateProgramme); 
    return certificateProgramme; 
} 

Dao.java

@Repository 
public interface CertificateDao extends CrudRepository<CertificateProgramme, Long> { 
    @Query("select t from CertificateProgramme t where t.user.id=?#{principal.id}") 
    List<CertificateProgramme> findAll(); 
    @Query("select t from CertificateProgramme t where t.user.id=?#{principal.id}") 
    CertificateProgramme ListAll(); 

私はここに助けが必要してください

@Modifying 
@Query("update CertificateProgramme ear set ear.flag = ?#{'FALSE'} where ear.user.id=?#{principal.id}") 
CertificateProgramme unFlagger(CertificateProgramme flag); 

コントローラ

これは、フラグフィールドを更新することになっているが、それは更新されません。私はむしろ間違いを起こしている。

@RequestMapping(value = "cert_prog/{certId}", method = RequestMethod.POST) 
    public String UpdateFlag(@PathVariable Long certId, CertificateProgramme certificateProgramme){ 
     certificateService.unFlagger(certificateProgramme); 
     return String.format("redirect:/cert_prog/%s/edit", certId); 
    } 

エラー

2017-02-25 21:40:28.257 ERROR 20769 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException: Executing an update/delete query] with root cause 

javax.persistence.TransactionRequiredException: Executing an update/delete query 
    at org.hibernate.jpa.spi.AbstractQueryImpl.executeUpdate(AbstractQueryImpl.java:71) ~[hibernate-entitymanager-4.3.11.Final.jar:4.3.11.Final] 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution$ModifyingExecution.doExecute(JpaQueryExecution.java:238) ~[spring-data-jpa-1.9.2.RELEASE.jar:na] 
    at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:78) ~[spring-data-jpa-1.9.2.RELEASE.jar:na] 
    at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:100) ~[spring-data-jpa-1.9.2.RELEASE.jar:na] 
    at or 
+0

「CertificateDao.unFlagger」メソッドはどこからでも呼び出さなかったため、変更クエリがトリガされませんでした。コントローラーまたはサービスメソッドから呼び出す。 –

+0

こんにちは@JakubCh。更新クエリを手伝ってもらえますか?フィールドを@Queryのような文字列に設定する方法を理解できません( "CertificateProgrammeのearセットear.flag = 'false' ear.user.id =?#{principal.id}) –

+0

こんにちは@JakubCh 。私はそれを私のサービスに加えました。それは私にエラーを与える。すべてのフィールドを検証する必要があります。私はちょうど1つだけを更新する必要があります –

答えて

1

あなたのDAOのメソッドを修正する必要があります。異なるエンティティの1つのフィールドを変更するクエリが必要な場合は、そのフィールド値とエンティティIDのみをパラメータとしてメソッドに渡します(または、メソッドが常にフラグをfalseに設定する場合はidのみ)。その後、適切なJPQL形式でクエリを参照します。そのような場合の例としては、それが必要あなたのケースではspring data JPA documentation

で見つけることができるようになります:

CertificateDAO.java

@Modifying 
@Query("update CertificateProgramme ear set ear.flag = FALSE where ear.id = ?1") 
int unFlagger(Long id); 

ServiceImpl.java

@Override 
public CertificateProgramme flag(CertificateProgramme certificateProgramme) { 
    certificateDao.unFlagger(certificateProgramme.getId()); 
    return findOne(certificateProgramme.getId()); 
} 

これはうまくいくはずです。あなたはおそらくCertificateProgrammeをサービスに渡してそのIDだけを渡すこともできます。

+0

あなたの助けとドキュメントのためにそんなにありがとう。これは正常に動作しました public CertificateProgrammeフラグ(CertificateProgramme certificateProgramme){ certificateDao.unFlagger(certificateProgramme.getId()); return certificateProgramme; } –

関連する問題