Make sure you are using NamedParameterJdbcTemplate
for update
operation.
Why do I got TransientDataAccessResourceException: PreparedStatementCallback; invalid argument?
-
11-06-2023 - |
Pregunta
I'm testing this funciton with JUnit and I getting TransientDataAccessResourceException: PreparedStatementCallback; Invalid argument value: java.io.NotSerializableException;
public boolean delete(long idTaskPriority) {
String sql = "DELETE FROM a_taskPriority WHERE idTaskPriority=:idTaskPriority";
MapSqlParameterSource params =
new MapSqlParameterSource("idTaskPriority", idTaskPriority);
return jdbc.update(sql, params) == 1;
}
Error trace:
org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback;
SQL [DELETE FROM a_taskPriority WHERE idTaskPriority=:idTaskPriority];
Invalid argument value: java.io.NotSerializableException;
nested exception is java.sql.SQLException:
Invalid argument value: java.io.NotSerializableException
I've tried as well with another params type but I got more or less the same error
public boolean delete(long idTaskPriority) {
String sql = "DELETE FROM a_taskPriority WHERE idTaskPriority=:idTaskPriority";
Map<String, Object> params = new HashMap<String, Object>();
params.put("idTaskPriority", idTaskPriority);
return jdbc.update(sql, params) == 1;
}
In this case I got the error trace
org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback;
SQL [DELETE FROM a_taskPriority WHERE idTaskPriority=:idTaskPriority];
Invalid argument value: java.lang.ArrayIndexOutOfBoundsException;
nested exception is java.sql.SQLException: Invalid argument value: java.lang.ArrayIndexOutOfBoundsException
I'm passing a long = 1, to try the funciton but it doesn't work.
Priority class
package com.javalabs.web.dao;
import java.util.Date;
import org.springframework.stereotype.Component;
@Component("priority")
public class Priority {
private long idTaskPriority = 0;
private long sortOrder = 0;
private String aka = "";
private String priority = "";
private Date timestamp;
public Priority() {
}
public Priority(long idTaskPriority) {
this.idTaskPriority = idTaskPriority;
}
/**
* @param priority
*/
public Priority(String priority) {
this.priority = priority;
}
/**
* @param order
* @param aka
* @param priority
*/
public Priority(long sortOrder, String aka, String priority) {
super();
this.sortOrder = sortOrder;
this.aka = aka;
this.priority = priority;
}
public void setIdTaskPriority(long idTaskPriority) {
this.idTaskPriority = idTaskPriority;
}
public long getIdTaskPriority() {
return idTaskPriority;
}
public long getSortOrder() {
return sortOrder;
}
public void setSortOrder(long sortOrder) {
this.sortOrder = sortOrder;
}
public String getAka() {
return aka;
}
public void setAka(String aka) {
this.aka = aka;
}
public String getPriority() {
return priority;
}
public void setPriority(String priority) {
this.priority = priority;
}
public void setTimestamp(Date timestamp) {
this.timestamp = timestamp;
}
public Date getTimestamp() {
return timestamp;
}
@Override
public String toString() {
return "Priority [idTaskPriority=" + idTaskPriority + ", sortOrder=" + sortOrder + ", aka=" + aka
+ ", priority=" + priority + ", timestamp=" + timestamp + "]";
}
}
PriorityDao class
public class PriorityDao {
private JdbcTemplate jdbc;
@Autowired
public void setDataSource(DataSource jdbc) {
this.jdbc = new JdbcTemplate(jdbc);
}
...
public boolean delete(long idTaskPriority) {
MapSqlParameterSource params = new MapSqlParameterSource(
"idTaskPriority", idTaskPriority);
String sql = "DELETE FROM a_taskPriority WHERE idTaskPriority=:idTaskPriority";
return jdbc.update(sql, params) == 1;
}
}
Solución
Otros consejos
The last attempt I've tried, it was by doing without parameters and replace the id directly in the sql.
public boolean delete(long idTaskPriority) {
String sql = "DELETE FROM a_taskPriority WHERE idTaskPriority=" + idTaskPriority;
return jdbc.update(sql) == 1;
}
And this way it is not as simple as it should be with parameters and it works. I can not figure out what is wrong with parameters, MapSqlParameterSource or HashMap.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow