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伙伴关系的第一步。
- 创建一个
Proposal
class 描述 PROPOSAL
table 并且它是
字段
- 创建
ProposalRepository
class
- 对您的 SQL 查询进行一些小改动,使其适应 JPQL 语法
- 在
ProposalRepository
中的新方法之上的 @Query
注释中设置更改的查询
- 通过自动装配
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 解决方案。
- 创建一个
Proposal
class 描述 PROPOSAL
table 并且它是
字段
- 创建
ProposalRepository
class、 扩展 JpaRepository
或 CrudRepository
- 通过
ProposalRepository
获取要更改的记录。获得一个的常用方法是使用 findById
方法
- 随意更改
- 通过 ProposalRepository 实例使用
save
方法,将更改的 Proposal 对象设置为参数
- 让Spring做这件事
@Autowired
private ProposalRepository proposalRepository;
private void example(Long recordId) {
Proposal proposal = proposalRepository.findById(recordId);
proposal.setProposalFor(10);
proposalRepository.save(proposal);
}
正在尝试更新数据库中的记录但出现此错误:
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伙伴关系的第一步。
- 创建一个
Proposal
class 描述PROPOSAL
table 并且它是 字段 - 创建
ProposalRepository
class - 对您的 SQL 查询进行一些小改动,使其适应 JPQL 语法
- 在
ProposalRepository
中的新方法之上的 - 通过自动装配
ProposalRepository
实例调用方法
@Query
注释中设置更改的查询
结果应该是这样的:
@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 解决方案。
- 创建一个
Proposal
class 描述PROPOSAL
table 并且它是 字段 - 创建
ProposalRepository
class、 扩展JpaRepository
或CrudRepository
- 通过
ProposalRepository
获取要更改的记录。获得一个的常用方法是使用findById
方法 - 随意更改
- 通过 ProposalRepository 实例使用
save
方法,将更改的 Proposal 对象设置为参数 - 让Spring做这件事
@Autowired
private ProposalRepository proposalRepository;
private void example(Long recordId) {
Proposal proposal = proposalRepository.findById(recordId);
proposal.setProposalFor(10);
proposalRepository.save(proposal);
}