我需要帮助。我正在更新数据库中的一个字段,但我不太擅长使用 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 方法时,我能够进行更新,但是当我在没有保存的情况下尝试时它不起作用。
我(CertificateProgramme certificateProgramme)
在ServiceImpl中定义了要实现的服务接口中的方法unFlagger
public interface CertificateService {
List<CertificateProgramme> findAll();
CertificateProgramme ListAll();
CertificateProgramme findOne(Long id);
void save(CertificateProgramme certificateProgramme);
CertificateProgramme flagger(CertificateProgramme certificateProgramme);
CertificateProgramme unFlagger(CertificateProgramme certificateProgramme);
}
服务实现程序
@Override
public CertificateProgramme flag(CertificateProgramme certificateProgramme) {
certificateDao.unFlagger(certificateProgramme);
return certificateProgramme;
}
道.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
你应该修复你的 dao 方法。如果您希望查询修改不同实体的一个字段,则仅将该字段值和实体 id 作为参数传递给方法(或者甚至仅 id,如果您希望您的方法始终将标志设置为 false)。然后在查询中以正确的 JPQL 格式引用它们。这种情况的例子可以在spring 数据 JPA 文档中找到
在您的情况下,它应该如下所示:
证书DAO.java
@Modifying
@Query("update CertificateProgramme ear set ear.flag = FALSE where ear.id = ?1")
int unFlagger(Long id);
服务实现程序
@Override
public CertificateProgramme flag(CertificateProgramme certificateProgramme) {
certificateDao.unFlagger(certificateProgramme.getId());
return findOne(certificateProgramme.getId());
}
这个应该有效。您可能还可以摆脱将 CertificateProgramme 传递给服务并仅传递 id 的方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句