Question

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;
    }
}
Was it helpful?

Solution

Make sure you are using NamedParameterJdbcTemplate for update operation.

OTHER TIPS

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.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top