Java 如何使用JPA查询更新单个表单
我需要帮助。我正在更新数据库中的一个字段,但我不太擅长使用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.")
@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());
}