[英]MsSQL named JDBC template LIKE match
我正在嘗試使用命名的JDBC模板與查詢進行類似匹配...
SELECT
id, guid, body, summary, status_id, language_id, is_mce, content_type_id,
last_edited_by, locked_by, owner_id, coordinator_id, writer_id, paperless,
content_body_type, created, updated, locked_timestamp
FROM dbo.content
WHERE notes LIKE :notes
:notes
綁定到%test%
,不幸的是它沒有返回任何結果。 我已經檢查了數據庫並驗證了此數據是否存在。 這不是進行類似比賽的正確方法嗎?
更新
生成此查詢的部分代碼...
String notes = search.getNotes();
if (notes instanceof String && notes.length() > 0) {
if (!previousClause) {
searchQuery.append("WHERE ");
previousClause = true;
}
searchQuery.append("notes LIKE :notes AND ");
queryMap.put("notes", "%"+notes+"%");
}
Collection<Category> categories = search.getCategoryCollection();
if (categories != null && categories.size() > 0) {
Short x = 0;
for (Category category : categories) {
searchQuery.append("INNER JOIN dbo.content_to_category AS content_to_category"+x.toString()+" ON (content_to_category"+x.toString()+".category_id IN (:categoryId"+x.toString()+") AND content_to_category"+x.toString()+".content_id = content.id) ");
queryMap.put("categoryId"+x.toString(), category.getId());
x++;
}
}
我假設:(1)您正在使用合理版本的Hibernate; (2)以上選擇的字段是content
字段的子集。
應該是這樣的:
Criteria crit = session.createCriteria(Content.class);
// add all selected fields:
ProjectionList projList = Projections.projectionList();
projList.add(Projections.property("id"));
projList.add(Projections.property("guid"));
projList.add(Projections.property("body"));
projList.add(Projections.property("summary"));
projList.add(Projections.property("status_id"));
projList.add(Projections.property("language_id"));
projList.add(Projections.property("is_mce"));
projList.add(Projections.property("content_type_id"));
projList.add(Projections.property("last_edited_by"));
projList.add(Projections.property("locked_by"));
projList.add(Projections.property("owner_id"));
projList.add(Projections.property("coordinator_id"));
projList.add(Projections.property("writer_id"));
projList.add(Projections.property("coordinator_id"));
projList.add(Projections.property("paperless"));
projList.add(Projections.property("content_body_type"));
projList.add(Projections.property("created"));
projList.add(Projections.property("updated"));
projList.add(Projections.property("locked_timestamp"));
crit.setProjection(projList);
// add a Restriction on notes field, using like:
crit.add(Restrictions.like("notes", "test", MatchMode.ANYWHERE));
// invoke query:
List list = crit.list();
更新
可以肯定的是,您應該使用的正確語法是(依靠直覺和那里的幾個博客;我無法確定文檔摘錄):
Query query = // create long complicated query that ends with "WHERE notes LIKE :notes"
query.setParameter("notes", "%test%");
在您的情況下這可能不起作用的原因是, like
運算符適用於varchar
操作數,而此類...從這段代碼中看來:
if (notes instanceof String && notes.length() > 0) {
您不確定該字段的基礎類型...可能不是notes
不是String
嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.