Java 如何使用JPA查询更新单个表单

Java 如何使用JPA查询更新单个表单,java,spring,hibernate,jpa,spring-data-jpa,Java,Spring,Hibernate,Jpa,Spring Data Jpa,我需要帮助。我正在更新数据库中的一个字段,但我不太擅长使用JPA查询。不过我还在学习 @Entity public class CertificateProgramme { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @NotNull(message = "The above field must not be blank.")

我需要帮助。我正在更新数据库中的一个字段,但我不太擅长使用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方法时,我可以进行更新,但当我在没有save的情况下尝试时,它不起作用

我在ServiceImpl中要实现的服务接口中定义了方法unFlagger
(CertificateProgramme CertificateProgramme)

public interface CertificateService {
    List<CertificateProgramme> findAll();
    CertificateProgramme ListAll();
    CertificateProgramme findOne(Long id);
    void save(CertificateProgramme certificateProgramme);
    CertificateProgramme flagger(CertificateProgramme certificateProgramme);
    CertificateProgramme unFlagger(CertificateProgramme 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();
控制器

这应该会更新标志字段,但不会更新。我犯了一个错误

@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);
    }
错误


你应该修正你的dao方法。若您想要修改不同实体的一个字段的查询,则仅将该字段值和实体id作为参数传递给方法(或者,若您希望方法始终将标志设置为false,则仅传递id)。然后以正确的JPQL格式在查询中引用它们。这种情况的例子可以在中找到

在您的情况下,它应该如下所示:

CertifiedAO.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());
}
ServiceImpl.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传递给service,而只传递id。

您没有从任何位置调用
CertificateDao.unFlagger
方法,因此不会触发您的修改查询。从控制器或服务方法调用它。Hi@JakubCh。你能帮我做一下更新查询吗。我不知道如何将字段设置为@Query(“updatecertificateProgramme ear set ear.flag='false'where ear.user.id=?#{principal.id}”)Hi@JakubCh之类的字符串。我把它添加到我的服务中。这给了我一个错误。它希望验证所有字段。我只需要更新一下,非常感谢你的帮助和文档。此已工作的公共CertificateProgramme标志(CertificateProgramme CertificateProgramme){certificateDao.unFlagger(CertificateProgramme.getId());返回CertificateProgramme;}
@Override
public CertificateProgramme flag(CertificateProgramme certificateProgramme) {
    certificateDao.unFlagger(certificateProgramme.getId());
    return findOne(certificateProgramme.getId());
}