문제

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;
    }
}
도움이 되었습니까?

해결책

Make sure you are using NamedParameterJdbcTemplate for update operation.

다른 팁

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.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top