2014-10-29 83 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