(JDBI / Dropwizard)从PostgreSQL检索自动递增的id时的PSQLException

时间:2015-02-16 01:50:20

标签: postgresql dropwizard jdbi

我正在尝试建立一个dropwizard项目,但我被卡住了。当我尝试使用@GetGeneratedKeys获取自动生成的id字段时,我得到以下异常:

org.postgresql.util.PSQLException: Bad value for type long : foo.

请求是一个简单的JSON请求

{"name":"foo"}

INSERT进入数据库是成功的,但似乎该语句返回名称的值而不是生成的id。我该如何解决这个问题?

我使用postgresql,表项目包含带有nextval的主键字段“id”('project_id_seq':: regclass)。以下是我使用的POJO,DAO和资源类:

public class Project {
    private long id;
    private String name;

    public Project() { // Jackson deserialization }
    public Project(long id, String name) {
        this.id = id;
        this.name = name;
    }
    ...
}

@RegisterMapper(ProjectMapper.class)
public interface ProjectDAO {
    @SqlUpdate("insert into project (name) values (:name)")
    @GetGeneratedKeys
    public long insert(@Bind("name") String name);
}

@Path("/project")
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public class ProjectResource {
    ProjectDAO projectDAO;

    public ProjectResource(ProjectDAO personDAO) {
        this.projectDAO = personDAO;
    }

    @POST
    @Timed
    public Response add(@Valid Project project) {
        long newId = projectDAO.insert(project.getName());
        project.setId(newId);
        return Response.status(Response.Status.CREATED)
                       .entity(project).build();
    }
}

===============

更新

我只是发现这与我的id列不是我表中第一列的事实有关。列名是。出现此问题是因为 @GetGeneratedKeys 正在使用org.skife.jdbi.v2.sqlobject.FigureItOutResultSetMapper,它正在使用返回org.skife.jdbi.v2.util的org.skife.jdbi.v2.PrimitivesMapperFactory。 LongMapper.FIRST。这个映射器正在调用 java.sql.ResultSet.getLong(1)通过方法extractByIndex(...)来检索生成的id,这在我的情况下不是id ...

我将通过重新组织数据库中的列来解决问题,但是如果可能的话,我希望有一个强大的实现:有没有办法在使用@GetGeneratedKeys Annotation时指定id列的列名? (org.skife.jdbi.v2.util.LongMapper类包含一个名为extractByName(...)的方法)

1 个答案:

答案 0 :(得分:3)

这是jdbi实现中的一个问题,并在https://github.com/jdbi/jdbi/issues/114

中描述的较新版本中修复