Trying to update a record in a database but getting this error:
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.
Code below is responsible for inserting it
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(); }
Im not sure if there is a type issue with propId being a Long or if i have written the SQL paths wrong or both.
Advertisement
Answer
You’re trying to execute an SQL query as JPQL.
There are a couple options to avoid the error in this situation:
#1 (easiest).
Use the createNativeQuery
method
Query q = em.createNativeQuery("UPDATE DATABASE.PROPOSAL p SET p.proposal_for = " + newCount + " WHERE p.proposal_id = "+ propIdNew );
#2.
Make your query a JPQL. It’s the first steps to the bright side Spring partnership.
- Create a
Proposal
class describing thePROPOSAL
table and it’s fields - Create a
ProposalRepository
class - Make a small changes in your SQL query in order to adapt it to JPQL syntax
- Set the changed query in
@Query
annotation on top of your new method inProposalRepository
- Call the method via autowired
ProposalRepository
instance
The result should be something like this:
@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 (preferable).
Use the full power of the bright side Spring.
Update the entity via the org.springframework.data.repository.CrudRepository#save
method.
In that case you still have to make steps 1 and 2 from option #2 – but end up with no manual JPQL solution required.
- Create a
Proposal
class describing thePROPOSAL
table and it’s fields - Create a
ProposalRepository
class, which extendsJpaRepository
orCrudRepository
- Get the record you want to change by getting it through
ProposalRepository
. The common way of getting one is by using afindById
method - Change it however you like
- Use
save
method via ProposalRepository instance, set the changed Proposal object as argument - Let the Spring do it’s thing
@Autowired private ProposalRepository proposalRepository; private void example(Long recordId) { Proposal proposal = proposalRepository.findById(recordId); proposal.setProposalFor(10); proposalRepository.save(proposal); }