2014-10-29 91 views
3

是否有可能具有jDBI查询的可选(空)参数?我试图获得在数据库查询中工作的可选参数。我正在使用dropwizard。可选jDBI参数

@SqlQuery("SELECT * \n" + 
      "FROM posts \n" + 
      "WHERE (:authorId IS NULL OR :authorId = author_id)") 
public List<Post> findAll(@Bind("authorId") Optional<Long> authorId); 

查询时AUTHORID传递工作,但给我当它是NULL这个错误:

org.postgresql.util.PSQLException: ERROR: could not determine data type of parameter $1 

这是我从调用资源路线:

@GET 
public ArrayList<Post> getPosts(@QueryParam("authorId") Long authorId) 
{ 
    return (ArrayList<Post>)postDao.findAll(Optional.fromNullable(authorId)); 
} 

从我读过的内容来看,这是可以做到的,所以我猜测我错过了一些东西或者有明显的错误。任何帮助将不胜感激!

仅供参考 - 我也试过它没有番石榴可选的(这是由dropwizard支持) - 只需发送一个作为一个长为null的authorId。只要它不为空,这也是有效的。

+0

您应该检查[jdbi社会](http://jdbi.org/community.html) – zloster 2014-11-07 19:08:59

+0

感谢@zloster,我贴这个有作为。 – nckturner 2014-11-11 19:20:25

回答

4

您需要在应用程序类上使用java8版本DBIFactory。它提供java 8可选支持以及joda LocalDateTime。

摇篮依赖:(将其转换为Maven的时候,如果你使用maven)

compile 'io.dropwizard.modules:dropwizard-java8-jdbi:0.7.1'

,并确保你的应用程序了类导入io.dropwizard.java8.jdbi.DBIFactory下运行使用。

public void run(T configuration, Environment environment) throws Exception { 
    final DBIFactory factory = new DBIFactory(); 
    final DBI jdbi = factory.build(environment, configuration.getDatabase(), "database"); 
    ... 
    ... 
} 
+0

谢谢,我会试试这个。唯一的问题是我在整个应用程序中都使用了番石榴。只要dropwizard和JDBI完全兼容java 8可选我不认为它是一个问题。 – nckturner 2014-11-25 18:39:07

+0

我明白了。然后,您可以简单地复制java8解决方案中的代码,并将Optionals更改为Guava。看到这两个: https://github.com/dropwizard/dropwizard-java8/blob/master/dropwizard-java8-jdbi/src/main/java/io/dropwizard/java8/jdbi/DBIFactory.java https:/ /github.com/dropwizard/dropwizard-java8/blob/master/dropwizard-java8-jdbi/src/main/java/io/dropwizard/java8/jdbi/args/OptionalArgumentFactory.java – Natan 2014-11-25 20:32:42

+0

这也适用于查询返回值吗? – 2015-01-09 16:41:25