2017-07-27 73 views
0

我有一份準備好的聲明中綁定變量定義爲:準備好的聲明中缺少一個LIKE子句

selectLikeShortnameStmt = cassandraDatasource.getSession().prepare(" select id, 
    parent_id, ultimate_parent_id, internal_ref, short_name, 
    long_name, controlling_team from counterparty where short_name like'%?%'"); 

但是當我嘗試像DAO使用此:

PreparedStatement pStmt = statementFactory.getSelectLikeShortnameStmt(); 
BoundStatement bStmt = pStmt.bind(short_name); 

我得到一個錯誤說Prepared語句沒有綁定變量。 爲了實現我現在用的SASI索引功能,即類似條款:

CREATE CUSTOM INDEX short_name_like_index ON counterparty (short_name) 
USING 'org.apache.cassandra.index.sasi.SASIIndex' 
WITH OPTIONS = { 'mode': 'CONTAINS' }; 
+0

像後添加一個空格,並開始? – Optional

回答

0

上述職位工作的罰款與綁定變量的簡單的PreparedStatement但我有另一個類似的問題。我正在使用Apache Lucerne索引構建器進行更復雜的查詢,即。範圍與索引定義,如:

CREATE CUSTOM INDEX counterparty_column_index ON counterparty (filter_column) 
USING 'com.stratio.cassandra.lucene.Index' 
WITH OPTIONS = { 
    'schema' : '{ 
     fields : { 
     controlling_team  : {type : "text", analyzer : "english"}, 
     relationship_manager : {type : "text", analyzer : "english"}, 
     review_date   : {type : "date", pattern : "dd-MM-yyyy"} 
     } 
    }' 
}; 

和語句定義爲:

log.info("CounterpartyStatement [selectByReviewDateAndTeamStmt]"); 
    selectByReviewDateAndTeamStmt  = cassandraDatasource.getSession().prepare(" select id, parent_id, ultimate_parent_id, internal_ref, short_name, long_name, controlling_team, " + 
              " country_incorp, country_operate, company_reg, relationship_manager, credit_rating, rating_source, pd, lgd, review_date, sector, defaulted, own_bank_entity " + 
              " from counterparty where filter_column = '{ " 
                 + " filter : {type:\"range\", field:\"review_date\", lower:\"01-01-2000\", upper:\"%s\"}," 
                 + " query : {type:\"contains\", field:\"controlling_team\", values:[\"%s\"]}," 
                 + " refresh:true" 
                 + " }'"); 

此格式是必要的,因爲標準的PreparedStatement綁定沒有拿起平常?佔位符。

碼則成了:

log.info("CounterpartyDAO.getRmCounterpartiesForReview [" + rm + "]"); 
    PreparedStatement pStmt = statementFactory.getSelectByReviewDateAndRmStmt(); 

    String query = pStmt.getQueryString(); 
    Date maxDate = dateUtils.addDays(dateUtils.getToday(), 3); 
    String maxDateString = dateUtils.getAnyDate(maxDate, "dd-MM-yyyy"); 
    query = String.format(query, maxDateString, rm); 

    ResultSet rs = cassandraDatasource.getSession().execute(query); 

也工作得很好,在dateUtils只是一個包,我寫操作日期等

1

將不起作用,因爲在'%?%'使用?是一個字符串的一部分,它不是自己的綁定變量,而不是你會需要做到以下幾點:

selectLikeShortnameStmt = cassandraDatasource.getSession().prepare("select id, parent_id, ultimate_parent_id, internal_ref, short_name, long_name, controlling_team from counterparty where short_name like ?"); 
PreparedStatement pStmt = statementFactory.getSelectLikeShortnameStmt(); 
BoundStatement bStmt = pStmt.bind("%" + short_name + "%"); 
+0

嗨,感謝您的更新,它的工作完美 – simteq