当前位置: 首页 > 知识库问答 >
问题:

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

束飞捷
2023-03-14

我正试图设置一个dropwizard项目,但我卡住了。当我试图用@getGeneratedKeys获得自动生成的id字段时,我会得到以下异常:

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

请求是一个简单的JSON请求

{"name":"foo"}
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();
    }
}

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

共有1个答案

华昕
2023-03-14

这是jdbi实现中的一个问题,在https://github.com/jdbi/jdbi/issues/114中所述的更新版本中得到了解决

 类似资料:
  • 问题内容: 我有一个使用hibernate和注解的j2ee应用程序。我如何注释我的pojo类中的Id字段以将其设置为自动增量或自动生成。在添加bean时,我是否将该字段留在bean中为null? 问题答案: 并在保留时将其保留为。(如果使用包装器) 在某些情况下,该策略被解析为或,因此你可能需要手动将其设置为(取决于基础数据库)。 似乎+ 指定序列名称对你有用。

  • 每次我执行INSERT或UPSERT(ON CONFLICT UPDATE)时,每个表上的增量列都会增加之前的更新数量。 例如,如果我有这张表: 然后运行这些查询: 这是一个相当大的问题。我们运行的脚本每天处理100000个通知。这会在每一次插入之间产生大约10000行的间隙,所以我们可能从100行开始,但当我们达到1000行时,最后一行的主键ID值会自动增加到100000以上。 如果这种情况继续

  • 问题内容: 我有一个使用hibernate和注解的j2ee应用程序。我如何注释我的pojo类中的Id字段以将其设置为自动增量或自动生成。在添加bean时,我是否将该字段留在bean中为null? 问题答案: 并在保留时将其保留为()。(如果使用/ 包装器) 在某些情况下,该策略被解析为to 或to ,因此您可能需要手动将其设置为or (取决于基础数据库)。 似乎 + 指定序列名称 对您有用。

  • 问题内容: 我正在尝试添加具有自动增量的主键。 我已经阅读了一些文档和其他问题-有和声明,但是不起作用。 这是我做的: 和 我怎么了 我只想将主键增加1。 问题答案: 是或多或少是一种列类型,所以说就像说,只是说: 如果您想自己创建序列,那么您想将序列中下一个值的默认值设为默认值,这意味着: 为了模拟通常的行为,您还需要使表拥有该序列: 阅读手册的“串行类型”部分可能会很有成果。 我还建议您不要对

  • 问题内容: 我们希望从mySQL获取一个自动递增的ID,而无需实际存储它,直到其他与mysql不相关的进程成功完成为止,这样,如果发生异常或应用程序崩溃,就不会存储该条目。我们需要使用ID作为其他进程的密钥。本质上,我们要“保留”自动增量,并将最后一行插入到mySQL中。我们不希望在知道整个过程成功完成之前插入任何行。 可以在mySQL中进行这种自动增量保留吗? 注意:我了解SQL事务。但是,我们

  • 我一直想利用Guice 但是,我开始遇到 Governator 和 Dropwizard 之间的类路径问题。我不得不在我的pom.xml中排除以下模块: 注意:我正在使用管理程序版本 1.3.3 但是现在我遇到的问题是没有指定基本包,乍一看是NoSuchMethodError,我想这可能是另一个类路径问题: 但是,在我的应用程序中,我使用了他们在dropwizer-guice github页面上显