2013-04-26 78 views
3

我想弄清楚如何使用JOOQ與NamedParameterJdbcTemplate。我已成功創建其他查詢,但我堅持創建一個包含WHERE子句的查詢。當我嘗試運行下面的方法時,出現錯誤org.springframework.dao.InvalidDataAccessApiUsageException:SQL [從「customer」中選擇「first_name」,其中「id」= cast(?as integer)]:給定1個參數,但預期0JOOQ SQL給出1參數,但預計0

當我嘗試在equals()中只使用整數時,得到相同的錯誤,如... .where(fieldByName(「id」)。equal(1001),same error and .where(fieldByName 「ID」)。等於(ID),同樣的錯誤。

如果我刪除WHERE子句,查詢本身似乎很好地工作。

我在做什麼錯在這裏?在我看來,該SQL語法是正確的。這可能是我愚蠢的,但我在這裏真的找不到問題。請幫忙!

public String getCustomerFirstName(int id) { 
    Query query = create.select(fieldByName("first_name")) 
        .from(tableByName("customer")) 
        .where(fieldByName("id").equal(param("id", id))); 
    Param param = query.getParam("id"); 
    SqlParameterSource namedParameters = new MapSqlParameterSource(param.getName(), id); 
    return this.getNamedParameterJdbcTemplate().queryForObject(query.getSQL(), namedParameters, String.class); 
} 

回答

2

爲了讓jOOQ生成命名參數,你必須明確地告訴它這樣做。

在你的情況,這將使

String sql = create.renderNamedParams(query); 

以上將取代您的來電

query.getSQL(); 

注意,這是記錄在這裏:

http://www.jooq.org/doc/3.0/manual/sql-building/bind-values/named-parameters

未來的版本的jOOQ(可能是3.1)可能會支持初始化DSLContext設置爲始終呈現命名參數。這是在路線圖上註冊爲功能請求:

https://github.com/jOOQ/jOOQ/issues/2414

+0

太棒了!我實際上閱讀了本教程的「命名參數」部分,但顯然我誤解了renderNamedParams()方法的概念。我的錯。一切工作正常,現在漂亮!謝謝你,盧卡斯! – Roger 2013-04-27 06:36:16

+0

@Roger:是的,它可能有點混亂。命名參數當前通過此方法顯式呈現,因爲jOOQ無法執行查詢,否則(通過JDBC)。事實上,我並沒有太多有關Spring Data及其命名參數支持的經驗。如果您在jOOQ中看到了API優化的一些潛力(例如更輕鬆地提取SQL和參數名稱/值映射),請隨時在用戶組上指定功能請求。 – 2013-04-27 09:00:29

相關問題