JPQL 问题更新记录

JPQL issue updating records

正在尝试更新数据库中的记录但出现此错误:

Caused by: Exception [EclipseLink-0] (Eclipse Persistence Services - 2.7.4.v20190115-ad5b7c6b2a): org.eclipse.persistence.exceptions.JPQLException
Exception Description: Problem compiling [UPDATE DATABASE.PROPOSAL p SET p.proposal_for = 10 WHERE p.proposal_id = 1]. 
[29, 43] The state field cannot be resolved.
[55, 68] The state field path 'p.proposal_id' cannot be resolved to a valid type.

下面的代码负责插入它

public int updateFor(int forCount, Long propId) {
        int newCount = forCount + 1;
        int propIdNew = propId.intValue();
        Query q = em.createQuery("UPDATE DATABASE.PROPOSAL p SET p.proposal_for = " + newCount + " WHERE p.proposal_id = "+ propIdNew );
        return q.executeUpdate();
    }

我不确定 propId 是否存在类型问题,或者我是否将 SQL 路径写错了或两者兼而有之。

您正在尝试以 JPQL 的形式执行 SQL 查询。
在这种情况下,有几个选项可以避免错误:

#1(最简单)。
使用createNativeQuery方法

Query q = em.createNativeQuery("UPDATE DATABASE.PROPOSAL p SET p.proposal_for = " + newCount + " WHERE p.proposal_id = "+ propIdNew );

#2.
使您的查询成为 JPQL。这是光明面Spring伙伴关系的第一步。

  1. 创建一个 Proposal class 描述 PROPOSAL table 并且它是 字段
  2. 创建 ProposalRepository class
  3. 对您的 SQL 查询进行一些小改动,使其适应 JPQL 语法
  4. ProposalRepository
  5. 中的新方法之上的 @Query 注释中设置更改的查询
  6. 通过自动装配ProposalRepository实例调用方法

结果应该是这样的:

@Modifying
@Query("update Proposal p set p.proposal_for = :newCount where p.proposal_id = :propIdNew ")
void update(@Param("newCount") int newCount, @Param("proposal_id") int propIdNew)

#3(首选)。
发挥光明面的全部力量Spring.
通过 org.springframework.data.repository.CrudRepository#save 方法更新实体。
在那种情况下,您仍然需要从选项 #2 中执行步骤 1 和 2 - 但最终不需要手动 JPQL 解决方案。

  1. 创建一个 Proposal class 描述 PROPOSAL table 并且它是 字段
  2. 创建 ProposalRepository class、 扩展 JpaRepositoryCrudRepository
  3. 通过ProposalRepository获取要更改的记录。获得一个的常用方法是使用 findById 方法
  4. 随意更改
  5. 通过 ProposalRepository 实例使用 save 方法,将更改的 Proposal 对象设置为参数
  6. 让Spring做这件事
    @Autowired
    private ProposalRepository proposalRepository;

    private void example(Long recordId) {
        Proposal proposal = proposalRepository.findById(recordId);
        proposal.setProposalFor(10);
        proposalRepository.save(proposal);
    }